我正在尝试使用一系列 string.replaceAlls 将文本文件中的所有 UTF-8 特殊字符替换为 ASCII 和 HTML 编码。一路走来,我遇到了一个特别顽固的问题:\uAC8B,UTF-8 中点。
这是将字符剪切掉一半的行:
string_out = string_out.replaceAll("¬ï", "·");
(“??” 是 UTF-8· 显示为扩展 ASCII 的方式。在遇到这一行之前,我尝试过“\uAC8B” 和许多其他编码,但没有成功。)
该行删除了 UTF-8 中点,但没有替换它,而且只替换了一半的情况。另一半时间它会错过角色,并保持不变。如果我制作它的多个副本或移动它周围的其他行,它甚至不会这样做。
这感觉像是一个多线程问题,但我不知道发生任何多线程。只是包含的 .jsp 文件中的一个从另一个 .jsp 运行的 ReplaceAlls block 。
什么可能导致这种类似竞争条件的行为?
最佳答案
AC8B不是一个点,而是一个汉字。您是说 00B7 吗?
Java 字符串始终为 UTF-16 Unicode。 UTF-8 是在文件中表示 Unicode 字符的一种方式,它不是 Java 字符串在内存中存储的方式。
注意读取输入和写入输出文件所使用的编码,它们应该是UTF-8,但是一旦文件内容被读入Java字符串,它就不再是UTF-8了,而是16 位 Unicode。
我认为你最好的机会是使用正确的 Unicode 转义,而不是尝试将 UTF-8 原始字节表示为 ASCII。
关于java - string.replaceAll 切割字符 50% 的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8732754/