我在 Windows 系统上创建了一个文本文件,我认为默认编码样式是 ANSI,文件内容如下所示:
This is\u2019 a sample text file \u2014and it can ....
我使用 Windows 的默认编码风格保存了这个文件,尽管也有像 UTF-8、UTF-16 等编码风格可用。
现在我想编写一个简单的 java 函数,我将在其中传递一些输入字符串并将所有 unicode 替换为相应的 ascii 值。
例如:- \u2019 应替换为“'”
\u2014 应替换为“-”等。
观察: 当我创建这样的字符串文字时
String s = "This is\u2019 a sample text file \u2014and it can ....";
我的代码工作正常,但是当我从文件中读取它时它不工作。我知道在 Java 中 String 使用 UTF-16 编码。
下面是我用来读取输入文件的代码。
FileReader fileReader = new FileReader(new File("C:\\input.txt"));
BufferedReader bufferedReader = new BufferedReader(fileReader)
String record = bufferedReader.readLine();
我也尝试过使用 InputStream 并将 Charset 设置为 UTF-8
,但结果仍然相同。
替换代码:
public static String removeUTFCharacters(String data){
for(Entry<String,String> entry : utfChars.entrySet()){
data=data.replaceAll(entry.getKey(), entry.getValue());
}
return data;
}
map :
utfChars.put("\u2019","'");
utfChars.put("\u2018","'");
utfChars.put("\u201c","\"");
utfChars.put("\u201d","\"");
utfChars.put("\u2013","-");
utfChars.put("\u2014","-");
utfChars.put("\u2212","-");
utfChars.put("\u2022","*");
任何人都可以帮助我理解这个问题的概念和解决方案。
最佳答案
将转义序列\uXXXX 与正则表达式匹配。然后使用替换循环将每次出现的转义序列替换为字符的解码值。
因为 Java 字符串文字使用 \
来引入转义,序列 \\
用于表示 \
。此外,Java 正则表达式语法对序列 \u
进行特殊处理(以表示 Unicode 转义)。因此 \
必须再次转义,并添加一个 \\
。所以,在模式中,"\\\\u"
的真正意思是,“匹配输入中的 \u
。”
要匹配数字部分,四个十六进制字符,使用模式 \p{XDigit}
,用额外的 \
转义 \
.我们希望将十六进制数作为一个组轻松提取,因此将其括在括号中以创建一个捕获组。因此,模式中的 "(\\p{XDigit}{4})"
表示,“匹配输入中的 4 个十六进制字符,并捕获它们。”
在一个循环中,我们搜索模式的出现,用解码的字符值替换每个出现。通过解析十六进制数来解码字符值。 Integer.parseInt(m.group(1), 16)
表示“将上一场比赛中捕获的组解析为 16 进制数。”然后用该字符创建替换字符串。替换字符串必须转义或引用,以防它是 $
,这在替换文本中具有特殊含义。
String data = "This is\\u2019 a sample text file \\u2014and it can ...";
Pattern p = Pattern.compile("\\\\u(\\p{XDigit}{4})");
Matcher m = p.matcher(data);
StringBuffer buf = new StringBuffer(data.length());
while (m.find()) {
String ch = String.valueOf((char) Integer.parseInt(m.group(1), 16));
m.appendReplacement(buf, Matcher.quoteReplacement(ch));
}
m.appendTail(buf);
System.out.println(buf);
关于java - 用 ASCII 替换 Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24215063/