我正在尝试获取有效的utf-8文本文件。 通过工作,我的意思是它应该在firefox和libreoffice中正确显示。
我写:
PrintWriter writer = new PrintWriter(savepath, "UTF-8");
对于使用Java进行阅读,我使用:
InputStreamReader isr = new InputStreamReader(new FileInputStream(loadpath), Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr);
再次读入并以Java显示时是正确的。
使用libreoffice或firefox(将编码设置为unicode)时,它会显示“乱码”字符。
示例文字:
C'est vrai (Java) The french "That's true" is shown correct
Cest vrai (firefox -set to unicode) the "'" becomes a square with "0092" inside
编辑:
CÂ’est vrai (firefox -set to middle european (windows) encoding)
EDIT2:
writer.println("Cest vrai");
writer.flush();
编辑3: 好的,我现在尝试使用
writer.println("C"+"\u0092"+" est vrai");
writer.flush();
这导致(将Firefox设置为unicode): https://imgur.com/qGRr9sC
在libreoffice calc导入中,它看起来甚至有所不同(正方形为空): https://imgur.com/MNQNDWo
答案 0 :(得分:1)
您陷入了一个不太明显的陷阱。 U + 0092不是有效的Unicode字符。 Windows 1252是Latin1的 close ,但添加了一些字符。例如,右单引号(’
)为U + 2019,但在Windows 1252字符集中映射为'\x92'
,在真正的Latin1中完全不可用。
如果要使用Java正确编写它,则应使用"C\u2019est vrai"
。
这意味着编码操作正确,但是unicode字符错误。 Firefox正确地将正方形的0092显示为不存在的Unicode字符。
经过更多研究,我可以知道代码在0x80到0x9f之间的字符是危险的。在Windows 1252字符集中根本不映射0x81、0x8d,0x8f,0x90和0x9d,所有其他字符都映射到256以上的Unicode字符。下面是一个列表,给出Windows 1252字符集中的代码,相应的unicode值,字符和其名称(由于使用了python unicodedata模块)
Different € 0x20ac 0x80 EURO SIGN
Not mapped 0x81
Different ‚ 0x201a 0x82 SINGLE LOW-9 QUOTATION MARK
Different ƒ 0x192 0x83 LATIN SMALL LETTER F WITH HOOK
Different „ 0x201e 0x84 DOUBLE LOW-9 QUOTATION MARK
Different … 0x2026 0x85 HORIZONTAL ELLIPSIS
Different † 0x2020 0x86 DAGGER
Different ‡ 0x2021 0x87 DOUBLE DAGGER
Different ˆ 0x2c6 0x88 MODIFIER LETTER CIRCUMFLEX ACCENT
Different ‰ 0x2030 0x89 PER MILLE SIGN
Different Š 0x160 0x8a LATIN CAPITAL LETTER S WITH CARON
Different ‹ 0x2039 0x8b SINGLE LEFT-POINTING ANGLE QUOTATION MARK
Different Œ 0x152 0x8c LATIN CAPITAL LIGATURE OE
Not mapped 0x8d
Different Ž 0x17d 0x8e LATIN CAPITAL LETTER Z WITH CARON
Not mapped 0x8f
Not mapped 0x90
Different ‘ 0x2018 0x91 LEFT SINGLE QUOTATION MARK
Different ’ 0x2019 0x92 RIGHT SINGLE QUOTATION MARK
Different “ 0x201c 0x93 LEFT DOUBLE QUOTATION MARK
Different ” 0x201d 0x94 RIGHT DOUBLE QUOTATION MARK
Different • 0x2022 0x95 BULLET
Different – 0x2013 0x96 EN DASH
Different — 0x2014 0x97 EM DASH
Different ˜ 0x2dc 0x98 SMALL TILDE
Different ™ 0x2122 0x99 TRADE MARK SIGN
Different š 0x161 0x9a LATIN SMALL LETTER S WITH CARON
Different › 0x203a 0x9b SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
Different œ 0x153 0x9c LATIN SMALL LIGATURE OE
Not mapped 0x9d
Different ž 0x17e 0x9e LATIN SMALL LETTER Z WITH CARON
Different Ÿ 0x178 0x9f LATIN CAPITAL LETTER Y WITH DIAERESIS