我的属性文件中有一个拉丁文1字符:
Privé vervoer
属性文件使用UTF-8存储.这导致了问题,并以一种混乱的方式返回到UI(单独的js应用程序)。我明白为什么会这样。默认情况下,属性文件被视为ISO-8859-1。因此,正如通常建议的那样,我将é改为它的Unicode转义表示- \u00E9。现在,一切都很有魅力,但我还是很困惑。Java将把这个字符当作编码的ISO-8859-1。这很酷。但是当这个字符串返回到UI时,它应该是UTF-8编码的,因为这是UI所期望的(Content-Type: "application/json; charset=utf-8"
和charset="utf-8"
元标记)。
我仍然无法理解从ISO-8859-1到UTF-8转换发生的时间.
如果这个字符是Unicode转义的,是否需要它?转义字符可能总是根据底层应用程序/OS正确显示吗?
我的栈: Mule、Java 8、Spring 4、基于角度的UI和中间的nodejs网关.
发布于 2017-01-20 08:02:55
字符编码包括将字符转换为字节序列。这是必要的,当你写到一个文件,或网络。
类似地,当您从文件或网络中读取字符时,您实际上读取了字节,并且字节序列被解码为字符。
属性类在从文件中读取时,期望该文件包含ISO_8859_1编码字符,即通过用ISO_8859_1编码字符获得的字节。因此,它从文件中读取字节,使用ISO_8859_1对它们进行解码,并将它们存储为字符串的键值对(其中包含字符)。
当您将这些字符写入网络时,这些字符将再次转换为字节,您当然不会被迫使用与属性文件相同的编码。因此,如果您愿意的话,可以选择UTF_8。
对于属性文件,ISO_8859_1是一个愚蠢的(IMO)选择,特别是考虑到它们用于资源包,包含以多种语言翻译的消息。实际上,ISO_8859_1只支持256个字符(不是所有可打印的),而不支持整个Unicode集。乌特夫-8应该是个更好的选择。您的特定字符(é
)是由ISO_8859_1支持的,因此您实际上不必转义它。但是,如果您在文件中存储了西里尔字母、阿拉伯语或其他类型的非莱克字符,那么您就必须将这些字符转义为\uxxxx
字符序列(它们本身只包含可以用ISO_8859_1编码的字符:\
、u
和数字)。
https://stackoverflow.com/questions/41758466
复制相似问题