`
lovnet
  • 浏览: 6878276 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

一个关于Unicode字符编码的奇怪问题

阅读更多

有一个学员问了一个关于Unicode字符编码的奇怪问题。

问题如下:

String strChina = "中国";

1)直接把每个字符中的内容对应着的整数打印出来,显示的结果就是这个字符的Unicode码,则下面的代码:

for(int i=0; i<strChina.length(); i++)

{

System.out.println(Integer.toHexString((int)strChina.charAt(i)));

}

打印出的结果是:

4e2d

56fd

2)下面的代码:

byte [] buf = strChina.getBytes("Unicode");

for(int i=0; i<buf.length; i++)

{

System.out.println(Integer.toHexString(buf[i]));

}

打印出的结果是:

ffffffff

fffffffe

2d

4e

fffffffd

56

打印出的“ffffffff”和“fffffffe”表示什么?“2d”和“4e”为什么和直接打印的结果是相反的?

回答如下:

在不同体系结构的计算机系统中,UTF-16编码的Unicode字符在内存中的字节存储顺序是不同的。使用Intel CPU的计算机中,一个多字节数据在内存中的存储形式通常是:低字节在前,高字节在后,这种方式称为Little-Endian(最不重要的字节在先)。但是,在使用其他CPU的一些计算机中,又是以高字节在前,低字节在后的方式存储多字节数据的,这种方式称为Big-Endian(最重要的字节在先)。对于0x1234这样一个双字节数据,使用Little-EndianBig-Endian两种方式在内存中存储的格式如图7.4所示。

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 285.75pt; HEIGHT: 164.25pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5Cflx%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png" o:title=""></imagedata></shape>

对于采用UTF-16编码的文件,通常都要用字节顺序标记(Byte Order Mark,简称BOM)来说明文件中的字符所使用的字节存储顺序。如果文件以0xFE 0xFF这两个字节开头,则表明文本的其余部分是Big-Endian UTF-16编码;如果文件以0xFF 0xFE这两个字节开头,则表明文本的其余部分是Little-Endian UTF-16编码;如果文件开头没有使用任何字节顺序标记,则暗指全部文本都是Big-Endian UTF-16编码。

ffffffff”和“fffffffe”实际上是0xff0xfe的两个字节,把他们当作整数打印时,就成了4个字节, 由于0xfe最高bit位是1,当它转成4字节的整数时,前面3个字节的所有bit位都补1,结果就成了0xfffffffe。前面打印出:

ffffffff

fffffffe

2d

4e

fffffffd

56

实际上是:

ff

fe

2d

4e

fd

56

前两个字节是在说字节存储顺序!

分享到:
评论

相关推荐

    简单的从ANSI指针读取UNICODE数据的示例

    在编程领域,尤其是在Windows API开发中,经常遇到字符编码的问题。ANSI和UNICODE是两种常见的字符编码形式,它们在处理字符串时有着显著的区别。ANSI通常指的是基于特定区域设置的单字节编码,如ASCII,而UNICODE则...

    编码知识入门

    在Web浏览器中,如果字符编码设置不正确,就可能出现乱码,如奇怪的“Ó”字符,这是因为浏览器错误地解释了这些二进制数据。为了避免这种情况,应确保网页的字符编码声明正确,并且浏览器能够正确地读取和解析这些...

    jsp文件编码转换工具(utf-8到GBK或相反)

    UTF-8是Unicode Transformation Format - 8位的缩写,是一种广泛使用的字符编码,支持世界上大部分语言。GBK(Great Chinese GBK)是中国大陆使用的汉字编码标准,它是GB2312的扩展,增加了对繁体字和其他字符的支持...

    奇怪的struts2的中文乱码问题及解决.docx

    本文将深入探讨一个关于Struts2在Internet Explorer(IE)浏览器中出现中文乱码的奇怪问题及其解决方案。 首先,中文乱码问题通常涉及到几个关键因素:数据库编码、开发文件编码和网页的Content-Type编码。在确保这...

    CTF中那些脑洞大开的编码和加密.doc

    8. Unicode 编码:Unicode 是一种字符编码标准,使用 16 位二进制数来表示字符。 9. Escape/Unescape 编码:Escape/Unescape 是一种编码方式,使用“\”符号来表示特殊字符。 10. HTML 实体编码:HTML 实体编码是...

    founder的字vb4两个的组合,会产生什么奇怪的问题?开发的过程都需要帮助

    VB4在这里指的是Visual Basic 4,这是一个早期的Microsoft Visual Basic版本,常用于开发Windows应用程序。在编程时,有时会遇到字符编码或字体渲染的问题,尤其是当使用特定字体(如Founder)并与某些字符组合时,...

    Python字符串压缩库Fivebit.zip

    Fivebit 是一个 Python 3 的短文本字符串压缩库,可将短的字符串压缩成 5 bit 编码,小写的 ASCII 可以压缩 37.5%。同时提供了一个字典用于最常用的英文单词(3个字母或者更长)。标点、数字和正常符号每个占用 10 ...

    乱码

    虽然上述内容主要涉及化学知识,但从中我们可以引申出IT领域的一个重要概念——字符编码。字符编码如ASCII、GBK、UTF-8等,它们决定了计算机如何存储和显示文字。在处理包含特殊符号的数据时,理解和掌握字符编码的...

    Weblogic中文乱码问题的处理.docx

    在Weblogic服务器运行Java应用程序时,中文字符的正确处理是开发者面临的一个常见挑战。由于编码和解码过程中的不匹配,中文字符可能会显示为问号或奇怪的符号,这被称为乱码问题。本文将详细讨论如何在Weblogic环境...

    乱码解读 帮助您解读乱码

    在IT领域,乱码是一个常见的问题,特别是在处理文本编码或者数据传输时。"乱码解读"这个主题旨在帮助用户理解并解决这个问题。乱码通常发生在不同的字符编码标准(如ASCII、GB2312、UTF-8等)不兼容或者处理不当的...

    网页乱码问题的解决方案

    在网页开发中,字符编码问题常常导致显示乱码,尤其是涉及到多语言环境时更为常见。网页乱码通常源于服务器端数据库编码设置、前端页面编码声明以及中间传输过程中的不一致或错误配置。例如,在给定的部分内容中提到...

    MySQL编码问题导致含中文字段无法进行删除操作

    在本文中,我们将深入探讨一个常见的编程问题,即“MySQL编码问题导致含中文字段无法进行删除操作”。在数据库管理中,编码问题是一个普遍且棘手的挑战,特别是当涉及到多语言字符集时。这个问题通常源于数据库系统...

    syslog

    然而,在非 ASCII 字符集如中文环境下,可能会出现乱码问题,表现为图形中的中文字符显示为奇怪的小方块或“口”字。 这些文章可能探讨了以下几点: 1. **编码设置**:Linux 系统和 Java 应用程序之间的编码不匹配...

    Android修改系统字体完美显示英文国际音标

    也搜了一些帖子,但没有很好的解决方案,默认的英文字体还是挺美观的,只是某些英语音标的编码位上缺失了相应的字符而已,Anroid使用Java作为默认开发环境,那默认的字体也应该是使用UNICODE UCS编码的,事实证明的却...

    Tinyxml 源代码(VC6 & VS2005)

    同时要注意在一个西方编码的控制台上(至少我的Windows机器是这样),Print()或者printf()也无法正确地显示这个文件,这不关TinyXML的事——这只是操作系统的问题。TinyXML没有丢掉或者损坏数据,只是控制台无法显示...

    PHP实例开发源码-风吟PHP版BOM移除工具.zip

    BOM是Unicode编码中的一个特性,用来标识文件是用UTF-8、UTF-16还是UTF-32编码的。在UTF-8编码中,BOM由三个特定的字节序列(0xEF, 0xBB, 0xBF)组成,出现在文件的开头。对于大部分文本编辑器和PHP解释器来说,BOM...

    php json_encode奇怪问题说明

    在PHP中,`json_encode` 是一个非常重要的函数,它用于将PHP值转换为JSON(JavaScript Object Notation)格式的字符串。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。然而,在使用...

    win11、win10中文文件名称乱码(菱形黑框问号)解决方案.docx

    - 在弹出的新窗口中,找到并取消勾选“Beta版:使用Unicode UTF-8为全球语言支持提供最佳兼容性”这一选项。 - 点击“确定”,根据提示重启计算机以使更改生效。 #### 进一步排查 如果上述方法无法解决问题,或者...

    超级有影响力霸气的Java面试题大全文档

     SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。...

    cpp代码-C和C++奇怪内容 ## # __VA_ARGS__和... (可变参数) 宽字符

    这个例子展示了如何将宽字符字符串转换为窄字符字符串,以便进行编码处理。 总结来说,`##`、`#`、`__VA_ARGS__`和`...`是C和C++编程中强大的工具,它们提供了预处理器宏和模板的灵活性。了解和熟练使用这些特性,...

Global site tag (gtag.js) - Google Analytics