2012-01-04 17 views
0

我想使用一系列的string.replaceAlls交换文本文件中的所有UTF-8特殊字符与ASCII编码&。一路走来,我遇到了一个特别固执的问题:\ uAC8B,UTF-8 middot。string.replaceAll切割字符50%的时间

下面是切出的字符线,一半的时间。

string_out = string_out.replaceAll("•", "·"); 

(“¬ï”是怎样一个UTF-8·显示为扩展ASCII绊倒在此行之前,我d尝试了“\ uAC8B”和其他许多编码,但都没有成功。)

该行切出UTF-8中点,它不替代它,它只做了一半的时间。另一半它错过了角色,并保持不变。如果我制作它的多个副本或移动其他行,它甚至不会这样做。

这感觉像是一个多线程问题,但我不知道任何多线程正在进行。从另一个.jsp运行包含的.jsp文件中的只是一个replaceAlls块。

什么可能导致这种竞争条件的行为?

回答

4

AC8B不是一个点,它是一个汉字。你的意思是00B7吗?

Java字符串始终是UTF-16 Unicode。 UTF-8是表示文件中Unicode字符的一种方式,它不是Java字符串存储在内存中的方式。

注意用于读取输入和编写输出文件的编码,它们应该是UTF-8,但是一旦文件内容被读入Java字符串,它就不再是UTF-8了,但是16位的Unicode。

我认为你最好的机会是使用正确的Unicode转义,而不是将UTF-8原始字节表示为ASCII。

+0

我从来没有弄清楚为什么我从单线程代码中获得竞争条件类似的行为,但获得正确的编码修复了它。当你指出我错误地解释了我从文件中剔除的一些唠叨时,它让我回过头来检查一下我正在做的关于我回来的一些假设。谢谢。 – baudot 2012-01-04 19:51:38

+0

酷!我很高兴它有帮助。 – theglauber 2012-01-04 20:16:40