请问有没有人能简明地为我定义以下术语:
- Unicode
- UTF7
- UTF8
- UTF16
- UTF32
- 编码页(Codepages)
- 它们与Ascii/Ansi/Windows 1252的不同之处
我不需要维基百科链接或太详细的内容,只需要简要介绍Unicode的巨大变化是如何发生的,以及为什么作为程序员你应该关心这些。
是的,我有一些见解,但可能是错误的,不过它帮助我理解了它。
让我们来看一些文本。它以一系列字节的形式存储在计算机的随机存取存储器中,代码页只是字节和你我读到的字符之间的映射表。因此,像记事本这样的应用程序随附其代码页,并将字节转换为屏幕上的内容,你会看到一堆垃圾、倒置的问号等等。这并不意味着你的数据已经损坏,只是读取字节的应用程序没有使用正确的代码页。一些应用程序比其他应用程序更聪明地检测要使用的正确代码页,而且内存中的一些字节流包含一个 BOM(字节顺序标记),它可以声明要使用的正确代码页。
UTF7、8、16 等都只是使用不同格式的不同代码页。
使用不同代码页存储的相同文件将具有不同的文件大小,因为字节存储方式不同。
它们与 Windows 1252 实际上并没有太大区别,因为那只是另一个代码页。
要获得更好、更智能的答案,请尝试其中一个链接。
myByteArray
,并且你知道它代表字符。然后你运行myByteArray.toString()
,你得到字符串Hello
。你的程序工作了!有一天,在发布代码后,你的德国客户打来电话说:“我们有一个问题,äöü没有正确显示!”你开始调试代码,感觉非常迷茫,因为你没有基本的编码理解。但是,通过对编码的理解,你知道错误可能是这样的:当运行myByteArray.toString()
时,你的程序假定该字符串是使用默认系统编码进行编码的。但也许不是这样!也许它是UTF8编码,而你的系统是LATIN-SOMETHING,所以你应该运行myByteArray.toString("UTF8")
!
资源:
我不建议像其他人建议的那样阅读Joel的文章。它是一篇很长的文章,包含很多无关紧要的信息。我几年前读过它,但它的实质并没有留在我的脑海中,因为有太多不重要的细节。
如前所述,http://wiki.secondlife.com/wiki/Unicode_In_5_Minutes 是了解 Unicode 本质的好去处。
如果您想真正理解像 UTF8 这样的可变长度编码,我建议阅读 https://www.tsmean.com/articles/encoding/unicode-and-utf-8-tutorial-for-dummies/。
wchar_t
和L"Hello"
始终是Unicode,显然是编码的。当然,即使"Mihai Nita"
也是Unicode,编码为ASCII
或ISO8859-1
或CP1252
甚至CP1253
等。 - tzot