当我将一个unicode字符串分配给
时,我对java有点新鲜 String str = "\u0142o\u017Cy\u0142";
System.out.println(str);
final StringBuilder stringBuilder = new StringBuilder();
InputStream inStream = new FileInputStream("C:/a.txt");
final InputStreamReader streamReader = new InputStreamReader(inStream, "UTF-8");
final BufferedReader bufferedReader = new BufferedReader(streamReader);
String line = "";
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
stringBuilder.append(line);
}
为什么两种情况下的结果都不同,文件a.txt也包含相同的字符串。但是当我打印文件的输出时,它打印z\u0142o\u017Cy\u0142
而不是实际的unicode字符。如果我想将文件打印为正在打印的字符串,我该怎么办呢。
答案 0 :(得分:5)
你的代码应该是正确的,但我想文件“a.txt”不包含用UTF-8编码的Unicode字符,而是包含转义字符串“\ u0142o \ u017Cy \ u0142”。
请使用支持UTF-8的编辑器检查文本文件是否正确,例如Windows上最新版本的Notepad或Notepad ++。或者用您喜欢的十六进制编辑器编辑它 - 它不应该包含反斜杠。
我尝试使用“€”作为文件的UTF-8编码内容并正确打印。请注意,并非所有Unicode字符都可以打印,具体取决于您的终端编码(在Windows上真的很麻烦)和字体。
答案 1 :(得分:5)
Java解释源代码中的\u0142
之类的unicode转义符,就好像您实际输入了该字符(带笔划的拉丁小写字母L)一样。
Java 不解释它从文件中读取的unicode转义。
如果您从{J}程序中取出String str = "\u0142o\u017Cy\u0142";
并将其写入文件a.txt
,然后在编辑器中打开文件,您将在文件中看到字符本身,不 \ nNNNNN序列。
如果您随后使用原始发布的程序并阅读 a.txt
文件,则应该看到您的预期。
答案 2 :(得分:2)
听起来好像你的文件字面上包含文本z\u0142o\u017Cy\u014
,即其中包含Unicode转义序列。
可能有一个用于解码这些的库,但你可以自己做 - 根据Java Language Specification,转义序列的格式总是\uxxxx
,所以你可以获得4位十六进制值{ {1}}对于该字符,将其转换为xxxx
的整数,将其转换为字符,最后用该字符替换整个Integer.parseInt
序列。
答案 3 :(得分:2)
您可以使用Apache Commons Lang.
import org.apache.commons.lang3.StringEscapeUtils;
// open the file as ASCII, read it into a string, then
String escapedStr; // = "\u0938\u093e\u0935\u0928@\u0928\u093f\u0915\u094d\u0938\u0940.\u092d\u093e\u0930\u0924"
// (to include such a string in a Java program you would have to double each \)
String hindiStr = StringEscapeUtils.unescapeJava( escapedStr );
System.out.println(hindiStr);
答案 4 :(得分:1)
那么,你想要unicode unicode代码点吗?没有可用的公共API。 java.util.Properties
有loadConvert()
方法可以完成此操作,但它是private
。检查Java源代码,了解您要重用的情况。它通过简单的解析进行转换。我不会使用正则表达式,因为在非常特殊的情况下这很容易出错。
或者您可能应该使用java.util.Properties
或其i18n对应java.util.ResourceBundle
并使用.properties
文件而不是普通.txt
文件。
答案 5 :(得分:0)
我认为它只是“UTF8”而不是“UTF-8”。
我在这里看到了它:Source
答案 6 :(得分:0)
我在this answer中将Java代码发布到了unescape(“descape”?)等许多其他内容。
答案 7 :(得分:-1)
您使用过FileInputStream,它是字节代码阅读器而非字符阅读器。请尝试使用FileReader
类似的东西:
BufferedReader inputStream = new BufferedReader(new FileReader(“C:/a.txt”));
然后您可以使用面向行的I / O BufferedReader来读取每一行。 FileInputREader是您应该避免的低级I / O.您将字符写入文件而不是字节,最好的方法是使用字符流。用于写入和读取,除非您需要写入字节/二进制数据。