即使在今天,人们经常会发现频繁出现字符编码问题。就拿最近这次的招聘信息:字符编码和“问题”
(注意:这是一个例子,不是垃圾作业后... :-)
我最近看到确切网站上的错误,流行IM程序中以及CNN背景图形中的错误。
我的两个部分的问题:
- 是什么原因导致这种特殊的,常用的编码问题?
- 作为一名开发人员,我应该如何处理用户输入以避免像这样的常见编码问题,如 ?如果此问题需要简化以提供有意义的答案,则假定内容通过网络浏览器输入。
即使在今天,人们经常会发现频繁出现字符编码问题。就拿最近这次的招聘信息:字符编码和“问题”
(注意:这是一个例子,不是垃圾作业后... :-)
我最近看到确切网站上的错误,流行IM程序中以及CNN背景图形中的错误。
我的两个部分的问题:
是什么原因导致这种特殊的,常用的编码问题?
当字符和字节之间的转换发生在使用错误的字符集时,会发生这种情况。计算机以字节形式处理数据,但为了以合理的方式向人类表示数据,必须将其转换为字符(字符串)。此转换基于一个字符集,其中有许多不同的字符集。
在具体的’
示例中,这是使用UTF-8读取的Unicode Character 'RIGHT SINQLE QUOTATION MARK' (U+2019)’
的典型CP1252表示。在UTF-8中,该字符存在字节0xE2
,0x80
和0x99
。如果您检查CP1252 codepage layout,那么您会看到这些字节完全代表字符â
,€
和™
。
这可以通过该网站不具有原始源正确读取引起的(它应该已经使用CP1252此),或者显示与Content-Type
响应报头中的错误charset=CP1252
属性(或属性的UTF-8页缺失;在Windows机器上,将使用CP1252的默认字符集)。
作为开发人员,我应该与用户输入做,以避免这样一个共同的编码问题?如果这个问题需要简化以提供有意义的答案,则假定内容通过网络浏览器输入。
务必阅读从任意字节流源的字符(例如,文件,URL,网络套接字等)使用公知的和个预定义字符集。然后,确保您始终使用Unicode字符集(最好是UTF-8)存储,编写和发送它。
如果您对Java很熟悉(您的问题历史证实了这一点),您可能会发现this article有用。