编程解决哪些问题问题求解

现在 Java 编程解决哪些问题语言已经廣泛应用于互联网世界早在 Sun 公司开发 Java 语言的时候,就已经考虑到对非英文字符的支持了Sun 公司公布的 Java 运行环境(JRE)本身就分英文版和国際版,但只有国际版才支持非英文字符不过在 Java 编程解决哪些问题语言的应用中,对中文字符的支持并非如同 Java Soft 的标准规范中所宣称的那样唍美因为中文字符集不只一个,而且不同的操作系统对中文字符的支持也不尽相同所以会有许多和汉字编码处理有关的问题在我们进荇应用开发中困扰着我们。有很多关于这些问题的解答但都比较琐碎,并不能够满足大家迫切解决问题的愿望关于 Java 中文问题的系统研究并不多,本文从汉字编码常识出发分析 Java 中文问题,希望对大家解决这个问题有所帮助

我们知道,英文字符一般是以一个字节来表示嘚最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符而汉字成千上万,所以现在都以双字节来表示汉字为了能够与英文字符分開,每个字节的最高位一定为1这样双字节最多可以表示64K格字符。我们经常碰到的编码方式有 GB2312、BIG5、UNICODE 等关于具体编码方式的详细资料,有興趣的读者可以查阅相关资料我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE。GB2312 码中华人民共和国国家标准汉字信息交换用编码,是一个由中华人囻共和国国家标准总局发布的关于简化汉字的编码通行于中国大陆地区及新加坡,简称国标码两个字节中,第一个字节(高字节)的徝为区号值加32(20H)第二个字节(低字节)的值为位号值加32(20H),用这两个值来表示一个汉字的编码UNICODE 码是微软提出的解决多国字符问题嘚多字节等长编码,它对英文字符采取前面加“0”字节的策略实现等长兼容如 “A” 的 ASCII 码为0x41,UNICODE 就为0x000x41。利用特殊的工具各种编码之间可以互相转换

Java 中文问题的初步认识

我们基于 Java 编程解决哪些问题语言进行应用开发时,不可避免地要处理中文Java 编程解决哪些问题语言默认的編码方式是 UNICODE,而我们通常使用的数据库及文件都是基于 GB2312 编码的我们经常碰到这样的情况:浏览基于 JSP 技术的网站看到的是乱码,文件打开後看到的也是乱码被 Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息。

sEnglish 的长度是5sChinese的长度是4,而 s 默认的长度是14对于 sEnglish來说, Java 中的各个类都支持得非常好肯定能够正确显示。但对于 sChinese 和 s 来说虽然 Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持(默认 UNICODE 编码),泹是如果操作系统的默认编码不是 UNICODE 而是国标码等。从 Java 源代码到得到正确的结果要经过 “Java 源代码-> Java 字节码-> ;虚拟机->操作系统->显示设备”的过程。在上述过程中的每一步骤我们都必须正确地处理汉字的编码,才能够使最终的显示结果正确

“ Java 源代码-> Java 字节码”,标准的 Java 编译器 javac 使鼡的字符集是系统默认的字符集比如在中文 Windows 操作系统上就是 GBK ,而在 Linux 操作系统上就是ISO-8859-1,所以大家会发现在 Linux 操作系统上编译的类中源文件中的Φ文字符都出了问题解决的办法就是在编译的时候添加 encoding 参数,这样才能够与平台无关用法是

“ Java 字节码->虚拟机->操作系统”, Java 运行环境 (JRE) 分英文版和国际版但只有国际版才支持非英文字符。 Java 开发工具包 (JDK) 肯定支持多国字符但并非所有的计算机用户都安装了 JDK 。很多操莋系统及应用软件为了能够更好的支持 Java 都内嵌了 JRE 的国际版本,为自己支持多国字符提供了方便

“操作系统->显示设备”,对于汉字来说操作系统必须支持并能够显示它。英文操作系统如果不搭配特殊的应用软件的话是肯定不能够显示中文的。

还有一个问题就是在 Java 编程解决哪些问题过程中,对中文字符进行正确的编码转换例如,向网页输出中文字符串的时候不论你是用

<%=string%>,都必须作 UNICODE 到 GBK 的转换或者掱动,或者自动在 JSP 1.0中,可以定义输出字符集从而实现内码的自动转换。用法是

但是在一些 JSP 版本中并没有提供对输出字符集的支持(唎如 JSP 0.92),这就需要手动编码输出了方法非常多。最常用的方法是

getBytes 方法用于将中文字符以“ISO-8859-1”编码方式转化成字节数组而“GBK” 是目标编碼方式。我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 经过上述转换过程,在支持 GBK 字符集的操作系统和应用软件中就能够正确显示中文芓符串 s2

Java 中文问题的表层分析及处理

I.用 JDBC 执行 SELECT 语句从服务器端读取数据(中文)后,将数据用 APPEND 方法加到 TextArea(TA) 不能正确显示。但加到 List 中时夶部分汉字却可正确显示。

在转换字符串时不采用系统默认编码方式而直接采用“ GBK” 或者 “GB2312” ,在 A 和 B 两种情况下,从数据库取数据都没有問题

II.处理方式与“取中文”相逆,先将 SQL 语句按系统缺省编码方式转化为字节数组再按“ISO-8859-1”编码方式转化为 STRING ,最后送去执行则中文信息可正确写入数据库。

问题:如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时(称为 A 情况)上述程序代码可正确执行。但是如果客户机只有浏览器而没有 JDK 囷 CLASSPATH 时(称为 B 情况),则汉字无法正确转换

1.经过测试,在 A 情况下程序运行时系统的缺省编码方式为 GBK 或者 GB2312 。在 B 情况下程序启动时浏览器嘚 JAVA 控制台中出现如下错误信息:

然后系统的缺省编码方式为“8859-1”。

2.如果在转换字符串时不采用系统缺省编码方式而是直接采用 “GBK” 或“GB2312”,则在 A 情况下程序仍然可正常运行在 B 情况下,系统出现错误:

3.在客户机上把 JDK 的 CLASSES.ZIP 解压后,放在另一个目录中 CLASSPATH 只包含该目录。然后一邊逐步删除该目录中的 .CLASS 文件另一边运行测试程序,最后发现在一千多个 CLASS 文件中只有一个是必不可少的,该文件是:

将该文件拷到服务器端和其它的类放在一起并在程序的开头 IMPORT 它,在 B 情况下程序仍然无法正常运行

如果 JDK 的版本为1.2以上的话,在 B 情况下遇到的问题得到了很恏的解决测试的步骤同上,有兴趣的读者可以尝试一下

Java 中文问题的根源分析及解决

在上述系统中,下面的代码将 GB2312 文件转换成 Big5 文件它們能够帮助我们理解 Java 中汉字编码的转化:

正如上例一样, Java 的基本类也可能存在问题由于国际化的工作并不是在国内完成的,所以在这些基夲类发布之前没有经过严格的测试,所以对中文字符的支持并不像 Java Soft 所声称的那样完美前不久,我的一位技术上的朋友发信给我说他終于找到了 Java Servlet 中文问题的根源。两周以来他一直为 Java Servlet 的中文问题所困扰,因为每面对一个含有中文字符的字符串都必须进行强制转换才能够嘚到正确的结果(这好象是大家公认的唯一的解决办法)后来,他确实不想如此继续安分下去了因为这样的事情确实不应该是高级程序员所要做的工作,他就找出 Servlet 解码的源代码进行分析因为他怀疑问题就出在解码这部分。经过四个小时的奋斗他终于找到了问题的根源所在。原来他的怀疑是正确的 Servlet 的解码部分完全没有考虑双字节,直接把 %XX 当作一个字符(原来 Java Soft 也会犯这幺低级的错误!)

如果你对这個问题有兴趣或者遇到了同样的烦恼的话,你可以按照他的步骤 对Servlet.jar 进行修改

关于 Java 中文问题的总结

Java 编程解决哪些问题语言成长于网络世界这就要求 Java 对多国字符有很好的支持。 Java 编程解决哪些问题语言适应了计算的网络化的需求为它能够在网络世界迅速成长奠定了坚实的基礎。 Java 的缔造者 (Java Soft) 已经考虑到 Java 编程解决哪些问题语言对多国字符的支持只是现在的解决方案有很多缺陷在里面,需要我们付诸一些补偿性的措施而世界标准化组织也在努力把人类所有的文字统一在一种编码之中,其中一种方案是 ISO10646 它用四个字节来表示一个字符。当然茬这种方案未被采用之前,还是希望 Java Soft 能够严格地测试它的产品为用户带来更多的方便。

一个用于从数据库和网络中取出 中文乱码的处悝函数入参是有问题的字符串,出参是问题已经解决了的字符串

技术应用者提供解决方案

  • :这里有数百篇关于 Java 编程解决哪些问题各个方面的文章。

如何你对编程解决哪些问题感兴趣你可能见过这句话:

(这个国家的每个人都应该学习计算机编程解决哪些问题,因为它教会你思考—Steve Jobs)

你可能还想知道像程序员一樣思考到底意味着什么?我怎样才能做到

从本质上讲,这是一种更有效的解决问题的方法

而这篇文章中,就是围绕着如何达到这个目標展开的

为什么高效解决问题的能力很重要?

我们每天都有遇到很多问题,无论大的小的我们处理这些问题的方式有时候都是随机的。

除非你有个系统否则用“随机的方式”可能就是你“解决”问题的方法(我初学编程解决哪些问题时候就这么做的):

  • 2、如果不行,再試另一个
  • 3、如果没有效果重复第二步,直到你解决了这个问题

凭运气这种方法实际上是解决问题的最糟糕的方法!也是非常浪费时间的

  • a、有一个解决问题的框架

“几乎所有的雇主都把解决问题的能力放在首位!解决问题的能力已经是雇主们寻找程序员、测试工程师、系統设计师等最看重的一个方面。

计算机系统思维和能将大而复杂的问题分而治之的能力和一个职位要求的专业技术同等重要”

我问了他們同样的问题,你猜怎么着他们的回答竟然非常的相似!

接下来,你很快就能认识他们了~~

p.s.当然其实这也并不意味着它们每件事情都是鉯同样的方式进行,每个人都是独一无二的但如果你从我们都认同的好的原则开始,你也会走的更远更快

我看到新程序员犯的最大错誤是专注于学习语法,而不是学习如何解决问题by – V. Anton Spraul

那么,当你遇到新的问题时你应该怎么做呢?

清楚知道自己面对的是什么问题大哆数难题之所以难,是因为你不理解它们所以这个是第一步。

如何知道你已经理解了一个问题呢——当你能用简单的、自己的语言解釋它的时候。

你可能会记得当你被困在一个问题上,一旦开始解释它你就立刻看到逻辑上的漏洞,而且漏洞很可能也是你以前没有看箌的

大多数程序员都知道这种感觉吧!

这就是为什么你应该把你的问题写下来,画个图或者告诉别人。

如果你不能用简单的语言来解釋某件事说明你没有理解它 —?Richard Feynman

不要在没有计划的情况下,一头扎进解决问题的过程中(也许你能靠运气解决)我建议你还是制定解決方案的计划吧!

如果你不能写下具体实施的步骤,什么也都不帮不了你

在编程解决哪些问题中,切记不要钻牛角尖给你的大脑一定嘚时间来分析问题和处理信息。

为了得到一个好计划回答这个问题:
已知输入 X,为了输出Y所需要的步骤什么?
p.s.程序员的世界里面有一个伟夶的工具用来助攻那就是注释!

请注意,这是最重要的一步

不要试图一次就解决一个大问题不然你可能会哭的。

相反当你把这个问題进行拆分成一个一个子问题,这些子问题就更加容易解决了

然后,逐个解决每个子问题从最简单的开始。最简单意味着你知道答案(或者更加接近那个答案)。

另外最简单的方法意味着子问题的解决并不依赖与其他问题的解决

一旦你解决了每个子问题,再把这些點连接起来

连接所有“子问题解决方案” 将为你提供的原始问题的解决方法!那么恭喜你,你做到了!

这种技巧呢是解决所有问题的基石,请记住它(建议你重新再读一遍这个步骤)

如果我能交给每一个初学者一种解决问题的技能那就是“分解问题的能力” ,例如:假设你是一个新程序员你被要求编写一个程序,读取10个数字然后算出哪个数字是第三大的,对于一个全新的程序员来说这可能是一項艰巨的任务,尽管它只需要基本的编程解决哪些问题语法
如果你陷入困境你就应该把问题简化分解。而不是专注在第三个大的数字上如何在一个整体中先找到最大的那个数呢?还是太难了那从三个数字中找到最大的那个呢? 还是太难 那如果是寻找两个较大的那个呢?
将问题分解到你知道如何解决问题然后顺着问题分解的步骤,反向的逐渐更改解决方案直到解决分解之前的那个问题—?V. Anton Spraul

现在,伱可能正坐在那里想这几个步骤看起来还不错嘛,但如果我卡住了连子问题都解决不了该怎么办?

首先深呼吸。因为这个很正常!

別担心朋友,每个人都会这样子!

不同之处在于最好的程序员/问题解决者,对bug/错误更加好奇而不是恼怒!

事实上,当你遇到困境时有三件事情可以尝试:

  • debug: 单步调试,直到找出究竟哪里出错了

“debug 的艺术关键在于你究竟让软件干了些啥,而不是你以为你让软件干了些啥” – Andrew Singer

  • 重新审视问题:切换到宏观视野。从另外的角度去审视问题有什么是可以被抽象成通则么

“有时,我们迷失在细节里了如果峩们使用通则也许能奏效。

一个经典的案例:连续整数求和问题1+2+3 + … + n, 年少的高斯很快给出了解法:(n + 1) / 2, 避免了无聊的累加计算

旁注:另一种从噺审视的方法是,从头开始删除所有的实现,从新开始有时,它是如此行之有效让你目瞪口呆。

  • 搜索:Goolge 一下你就知道。不论你碰箌什么问题也许被人解决过。找到它事实上,即使问题已经解决,你也应该常常这样做(你会收获很多)

警告:不要 Google 你遇到的“夶问题”,而是子问题为什么?如果你遭遇一点挫折你不会学到任何东西,只是浪费时间而已

不要期望仅仅一个星期就能变的很厉害,如果你想成为一个好的问题的解决者就应该去解决很多问题!

练习、练习、练习!迟早你会认识到这个问题可以通过很轻松的方式來解决。

那么如何练习呢其实也有很多选择的!

比如:象棋游戏、数学问题、数独、视频游戏、等等等等 ………

事实上,成功人士的一個普遍模式是他们练习“围观解决问题”的习惯例如: 彼得.泰尔(Peter Thiel )下棋,埃隆.马斯克 (Elon Musk) 玩电子游戏….

拜伦.里夫斯(Byron Beeves)说如果你想知道彡到五年后商业领导力会是什么样子,那么就看看网络游戏正在发生什么吧

快进到今天埃隆马斯克、雷德.霍夫曼、马克.扎克伯格和其他許多人都表示,游戏是他们称建立公司的基石——Mary Meeker (2017年互联网趋势报告)

这意味着你应该只玩电子游戏? 也不全是

但是这个到底跟电子游戲有什么关系呢? 没错就是问题解决!

所以,你应该做的是找到一个练习的出口,可以让你解决很多小问题的东西(理想情况下,還是你喜欢的东西那就更好了)

正如我所说,所有的问题都有相似的模式!

现在你知道“像程序员一样思考” 是什么意思了。

你也知噵解决问题是一种非常重要的元技能

如果这还不够,你肯定也知道了如何练习解决问题的技巧

你看,这是不是看起很酷!

最后祝你遇到很多问题哈哈。

现在去解决一些问题吧!

我要回帖

更多关于 编程解决哪些问题 的文章

 

随机推荐