zoukankan      html  css  js  c++  java
  • 再谈乱码

    对于我们中国的程序员,中文乱码恐怕是最常见的问题了吧!

    几乎从第一天开始就不断遇到,之后也网上查资料解决过一些,但是,在某些情况下,他又出现了!而且每次可能解决方法还不一样。。 每次都是莫名其妙的就解决了,或者长拖不决。。

    有些乱码不解决也可以——因为它是注释。但是有些乱码就非解决不可了吧! —— 它可能是方法的参数。。。 方法的结果。。 或者因为乱码,注释也不认得从而代码无法编译(我就遇到过这样的,不能说注释的乱码就一定无害)。。

    真是不胜其烦!甚至有些害怕了。。

    可能的情况

    1 html中硬编码汉字在ide中coding的时候好好的, 到了浏览器就出乱码。

    其实掌握几点关于乱码的知识。 问题迎刃而解, 没有那么可怕:

    1 首先,我们认为,对于最初写汉字的地方一定是正确书写的,书写的环境叫做BaseEnv或WriteEnv ,—— 它的编码就是这个文件的编码格式,记为WriteCharSet。

    2 然后我需要保存它,假设我们因为某些原因(有时候是为了统一编码格式,有时候自己也不知道。。)修改了文件的编码格式为SaveCharSet。SaveCharSet不包容WriteCharSet,于是就出现了乱码。——对此乱码,可能我又会再以其他编码格式编码一遍,出现"更乱的乱码"--- 后面越来越“不堪入目”

    2.2 还有一种可能是我们以复制黏贴的方式将代码保存到了另外一个文件中,但此文件的编码格式格式不同于之前,所以出现。又或者,我们新建一个文件保存复制代码,然后又将其以另一种方式保存。。。

    3 传输过程中的乱码,常见的是,js里面写的参数(含有汉字)是正确的,传到了java后台就变成了乱码—— 传过来的汉字编码不同于我们解析它时候的格式———— 程序运行时候,遇到任何字符(这个时候准确说是byte[])会去尝试解析它时候使用的编码格式—— 不可能不解析的吧,因为传过来的是二进制流,需要按照一定的‘停顿节奏’把他们分开了读取。。。因为不同编码对不同字符使用不同字节数保存!

    在数据库中汉字是正常保存的,但是数据库编码格式不同于java解析汉字的编码格式。 所以。。。

    4 一般来说,程序运行中编码格式是固定的—— 当然,我们可以在运行中改变编码格式。 或者我们增加filter来出现字符流编码。。

    关于乱码的还原:

    保存在格式为CharSet1文件A中的汉字,出现运行时CharSet1的字符流zfl1被转换为CharSet2的字符流zfl2,如果这种转换一一对应,自然可以简单欢迎——通过String不同的构造函数。

    ———— 要注意的是,我们不能保证两不同字符流zfl总是有这样的一一对应关系。假如CharSet1的字符a经过CharSet2重新编码后变成x,而对于CharSet2x是一个特殊字符,表示未知字符,x加密后还是x,这样,对于CharSet1中的x,CharSet2无法辨认,‘无能为力’

    又比如,

    已知,0x100 = 0,0x10=0;你能从结果和第一个乘数区分第二个乘数吗?

    但是我们可能并不知道其原始编码是CharSet1,通过String以CharSet2错误解析成了字符流zfl3,然后我们又把zfl3以CharSet3编码变成zfl4,如果可逆还好,——如果这条路不可逆, 最后可能就永远无法还原zfl1了。。。

    参考 http://www.iteye.com/topic/909686

  • 相关阅读:
    结婚电子
    ASP.NET 5简介
    定位500错误!
    Web项目
    JS编程
    CQRS 示例
    领域驱动设计的面向服务架构
    Oracle免费的便捷Web应用开发框架
    ThreadLocal是否会引发内存泄露的分析 good
    应用的代码没有用新的类库来进行编译(转)
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/3588444.html
Copyright © 2011-2022 走看看