0 0

关于字符编码的疑惑20

实验环境:
   操作系统:windows xp2
   开发工具:myEclipse8.0
   jdk      : jdk 1.6






实验步骤:
  1、从Linux服务器下载一个文件到本地 ,下载到本地的文件名为test.txt(文件编码为gb2312,字节数为142,其中中文字符为10)
  2、用一个工具类A从test.txt()中读取数据,读取的时候设置BufferedReader reader = new BufferedReader(new InputStreamReader (new FileInputStream(file),"GBK"));  将读取的内容保存在tempStr中

  3、打印出tempStr.getBytes().length为152 

  4、然后对tempStr进行解码,编码 。
        byte strBytes2[]=tempString.getBytes("GBK");
String tempString2=new String(strBytes2,"GBK");

  5、打印出strBytes2.length为142

  6、将tempString2传送给工具类B,工具类B再对tempString2进行编码,解码
        yte strBytes3[]=tempString2.getBytes("GBK");
String tempString2=new String(strBytes3,"GBK");

  7、打印出strBytes3的length为 152(这是为什么)[size=medium]
[/size]
      

  

  

问题补充:就是10个汉字加上122个英文字母,总共142的字节
OpenMind 写道
把那个文件上传上来供网友们分析可能会好点。


问题补充:首先谢谢你的回答,我实验过了,这个strBytes2是gbk编码的,我连字节数组的值都测试过,里面不是三字节编码。另外,我觉得是在工具类B接受某一个字符串的时候,默认都是utf-8编码的,所以strBytes3的长度还是152,个人觉得只能将这个字节数组传给B,然后再编码应该就没问题了
nizen 写道
不赞同myali88观点,
仅从第3,第4点比较tempStr.getBytes().length与tempStr.getBytes("GBK").length的不同就可以看出,你的程序执行时候系统环境的编码是UTF8.

解释第3点与第5点不同原因:常用汉字按UTF-8编码一般是3字节为一个汉字,而gbk则是2字节,所以用gbk读取gbk文件没问题,获取了122英文和10中文,但是在解码后,用默认utf8编码则会多出3*10-2*10=10,这就是152与142的差别所在。

解释第5点和第7点不同原因:问题出在String tempString2=new String(strBytes2,"GBK");  语句上,strBytes2已经已经是一种基于UTF8编码的内容了,对它用gbk解码生成的tempString2则会变成了15个汉字的乱码,最后通过byte strBytes3[]=tempString2.getBytes("GBK"); 则会对15个汉字进行GBk编码,15*2=30,最终又变成了152字节了。

2012年2月16日 11:54

10个答案 按时间排序 按投票排序

0 0

很简单,楼主的文件没问题,问题就出在楼主的JAVA文件编码方式上了,如果采用utf-8编码就会出现楼主说的情况,当你采用reader.readLine();读取字符串时,java回把读取到的字符串自动转换为和你的java文件编码一致,同样字符串类之间的传递也存在同样的情况。如果使用BufferedInputStream类直接从文件中按字节读取就不会存在上述问题。
建议楼主将自己的JAVA文件编码改成GBK试试就可以了

2012年3月02日 08:16
0 0

不好意思,楼主,的确是我对第5点和第7点区别的判断错了。我是错以为第3点的tempString已经是用UTF8解码过的内容,tempString的内容应该是没问题的,经过byte strBytes2[]=tempString.getBytes("GBK"); 得到的应该就如你所说的。
所以第5点和第7点为什么会这样我不知道。不知工具类B所做的操作是否就如你列出第6点的代码一样。

2012年2月25日 00:32
0 0

nizen的推理能力不错啊

2012年2月23日 13:28
0 0

nizen 分析的很正确也很透彻,厉害

2012年2月23日 13:27
0 0

中文不同编码,所占字节不同,其转换结果就不同

2012年2月23日 11:51
0 0

要找到问题的根源,还是上传文件吧,这样才能分析出原因。楼主,有些东西用肉眼是看不出来的。不要以为就是个简单的汉字+英文字符的文件。

2012年2月17日 08:42
0 0

不赞同myali88观点,
仅从第3,第4点比较tempStr.getBytes().length与tempStr.getBytes("GBK").length的不同就可以看出,你的程序执行时候系统环境的编码是UTF8.

解释第3点与第5点不同原因:常用汉字按UTF-8编码一般是3字节为一个汉字,而gbk则是2字节,所以用gbk读取gbk文件没问题,获取了122英文和10中文,但是在解码后,用默认utf8编码则会多出3*10-2*10=10,这就是152与142的差别所在。

解释第5点和第7点不同原因:问题出在String tempString2=new String(strBytes2,"GBK");  语句上,strBytes2已经已经是一种基于UTF8编码的内容了,对它用gbk解码生成的tempString2则会变成了15个汉字的乱码,最后通过byte strBytes3[]=tempString2.getBytes("GBK"); 则会对15个汉字进行GBk编码,15*2=30,最终又变成了152字节了。

2012年2月17日 00:59
0 0

linux和window的换行符不一样吧

2012年2月16日 21:27
0 0

引用
就是10个汉字加上122个英文字母,总共142的字节

从“152”的数字上,我推测你从linux上下载的文件编码是UTF-8的,中文字符为3个字节。

2012年2月16日 15:20
0 0

把那个文件上传上来供网友们分析可能会好点。

2012年2月16日 12:34

相关推荐

    Python开发编码规范[参考].pdf

    * 使用 ASCII 或 Latin-1 编码,仅在注释或文档字符串中需要使用 Latin-1 时。 * 使用 \x 转义字符在字符串中包含非 ASCII 字符。 代码风格 * 在一个项目内的一致性非常重要,项目内的代码风格应该保持一致。 * 在...

    textdiff对比工具

    它通常包含了一系列的对比算法,能够精确地识别出文本文件中的每一个字符差异,同时提供清晰的高亮显示,以便用户快速定位和理解差异所在。 TextDiff.hlp是程序的帮助文件,里面详细介绍了软件的功能、操作方法以及...

    完美转换UTF-8 到 GB2312(源代码和详细说明)

    笔者感到疑惑的是,当初开发source insight的这帮人现在哪里去了?为何不继续开发?这么好的工具,却不再更新了,实在让人可惜。 可惜归可惜,程序还是要看。乱码怎么办?很多人用笨方法,用记事本打开源代码,再...

    js与ASP.NET 中文乱码问题

    总结,处理JS与ASP.NET中的中文乱码问题,关键在于理解字符编码的原理,正确设置字符集,并合理使用编码与解码函数。同时,对于JSON数据的处理,应遵循语法规则并使用专门的解析方法,以确保数据的正确性。

    OCR 文字 和字母识别matlab程序

    OCR(Optical Character Recognition,光学字符识别)技术是一种将图像中的文字转换为机器编码文本的计算机视觉技术。在MATLAB环境中实现OCR可以帮助开发者快速原型设计和测试文本识别算法。MATLAB是一个强大的数值...

    Velocity资料

    对于国际化应用,字符编码问题尤为重要,文档中提到了Velocity在模板编码上的支持。 16. Velocity与XML: 文档还提到了Velocity和XML的集成,虽然这部分内容不完整,但可知Velocity可能提供了处理XML数据的功能。 ...

    JDK6API.chm

    `java.nio.charset`包则支持多种字符编码和解码。 5. 输入/输出 `java.io`包提供了用于处理输入和输出的各种类,如`FileInputStream`、`FileOutputStream`、`BufferedReader`、`PrintWriter`等,用于文件操作和流的...

    notrpad2中文版

    在格式转换方面,Notepad2具备转换文本编码的能力,可以将文件从一种编码格式转换为另一种,例如从GBK转换为UTF-8,这对于处理中文字符集问题非常实用。此外,它还可以进行行尾符转换,如Windows下的CRLF转换为Unix...

    HtmlCleaner使用说明文档

    HtmlCleaner提供了丰富的配置选项,允许用户根据实际需求进行定制化的清理工作,比如设置字符编码、转换属性格式、过滤标签或属性等。这些高级功能为开发者提供了便利,使得HTML的清理工作能够更加精细和高效。 在...

    计算机组成原理答案+(科学出版社+白中英)

    1. **数字系统与编码**:包括二进制、八进制、十六进制的转换,以及BCD码、ASCII码等字符编码方式。理解这些编码系统对于理解和处理计算机中的数据至关重要。 2. **逻辑运算与组合逻辑电路**:布尔代数是理解逻辑...

    每个Java初学者都应该搞懂的六个问题

    对于初学者而言,在学习Java的过程中可能会遇到各种疑惑和挑战,本文旨在帮助初学者理解并掌握Java编程中的几个关键概念,以便更加高效地学习和发展。 #### 1. 字符串与字符串对象的理解 字符串在Java中是一种特殊...

    SVN在客户端执行UPDATE报403的处理办法

    1. **检查URL编码**:确保所有路径中的中文字符都已正确编码。可以尝试手动构造正确的URL进行测试。 2. **审查权限配置**:再次检查SVN服务器上的权限设置,尤其是`/test`路径及其子路径的权限。如果有必要,可以...

    medibus_drager.pdf

    根据提供的文件信息,以下是关于德尔格呼吸机对接开发文档的知识点: 1. 呼吸机和医疗行业应用:呼吸机是一种在医院及重症监护中重要的医疗设备,用于帮助病患进行呼吸。德尔格公司(Dräger)是一家专业从事呼吸机...

    郝斌老师C语言大纲(2020年8月18日).pdf

    - ASCII是一种字符编码标准,规定了字符与整数值的对应关系。 ### 高级C语言编程预备知识 - CPU内存条与VC++6.0操作系统之间的关系。 - 代码规范化,提高程序可读性,减少出错概率。 - 字符的存储方式与整数相同。...

    辽宁省重点高中2019-2020学年高二数学12月月考试题答案(PDF)

    然而,实际的内容部分显示为无法识别的字符,这可能是因为文本格式或编码问题导致的显示乱码。在这样的情况下,我无法提供具体的数学知识点详细说明。 通常,高二数学会涵盖多项式、函数(包括一次函数、二次函数、...

    计算机组成原理,第二版,答案

    1. **数制与编码**:包括二进制、八进制、十进制和十六进制的转换,以及二进制补码、原码和反码的概念,还有ASCII码和EBCDIC码等字符编码方式。 2. **逻辑门**:介绍基本的逻辑门电路,如与门、或门、非门、与非门...

    计算机基础教学大纲.doc

    此外,还会涉及进位计数制(如二进制、八进制、十进制、十六进制)的转换以及信息编码,如ASCII和Unicode字符编码。 二、Windows XP操作系统(8学时) 这模块主要教授Windows XP的基本操作,包括桌面管理、文件和...

    jfinalDemo

    5. **编码问题**:在处理非UTF-8编码的视图文件时,如果JFinal的字符集配置不正确,可能导致乱码。需要确保项目全局的字符集设置与视图文件一致。 6. **插件冲突**:如果安装了某些插件,可能会影响到`baseViewPath...

    ireport用户手册

    - 设置 jrxml 文件的字符编码方式。 #### 五、报表元素 - **插入和选择报表元素:** - 如何在报表中添加各种图形和文本元素。 - **定位与元素排序:** - 控制元素在报表中的位置及其相对顺序。 - **使用元素树...

Global site tag (gtag.js) - Google Analytics