在java中读取unicode字符

当我分配一个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字符。 如果我想将文件内容也打印为正在打印的字符串,我知道如何做到这一点。

你的代码应该是正确的,但我想文件“a.txt”不包含用UTF-8编码的Unicode字符,而是包含转义字符串“\ u0142o \ u017Cy \ u0142”。

请使用支持UTF-8的编辑器检查文本文件是否正确,例如Windows上最新版本的Notepad或Notepad ++。 或者用您喜欢的hex编辑器编辑它 – 它不应该包含反斜杠。

我尝试用“€”作为文件的UTF-8编码内容并正确打印。 请注意,并非所有Unicode字符都可以打印,具体取决于您的终端编码(在Windows上真的很麻烦)和字体。

Java解释了源代码中的unicode转义\u0142 ,例如你的\u0142 ,就好像你实际上已经将该字符(带笔划的拉丁小写字母L)输入到源代码中一样。 Java不解释它从文件中读取的unicode转义。

如果你把你的String str = "\u0142o\u017Cy\u0142"; 并将其写入Java程序中的文件a.txt ,然后在编辑器中打开该文件,您将在文件中看到字符本身, 而不是 \ uNNNN序列。

如果您随后使用原始发布的程序并读取 a.txt文件,您应该看到您的预期。

听起来好像你的文件字面上包含文本z\u0142o\u017Cy\u014 ,即其中包含Unicode转义序列。

可能有一个用于解码这些文件的库,但你可以自己做 – 根据Java语言规范 ,转义序列的格式始终为\uxxxx ,因此你可以获得字符的4位hex值xxxx ,将其转换为使用Integer.parseInt整数,将其转换为字符,最后用字符替换整个\uxxxx序列。

您可以使用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); 

那么,你想要unicode unicode代码点? 没有可用的公共API。 java.util.Properties有一个loadConvert()方法,它正是这样做的,但它是private 。 查看Java源代码,了解您要重用的情况。 它通过简单的解析进行转换。 我不会使用正则表达式,因为在非常特殊的情况下这很容易出错。

或者你可能应该使用java.util.Properties或其i18n对应的java.util.ResourceBundle.properties文件而不是普通的.txt文件。

也可以看看:

  • 属性API教程
  • 国际化教程 – ResourceBundle 。

我认为它只是“UTF8”而不是“UTF-8”。

在这里我看到了它: 来源

我在这个答案中发布了Java代码到unescape(“descape”?)这样的东西以及其他许多东西。

您使用过FileInputStream,它是一个字节代码阅读器而不是字符阅读器。 请尝试使用FileReader

就像是:

BufferedReader inputStream = new BufferedReader(new FileReader(“C:/a.txt”));

然后你可以使用面向行的I / O BufferedReader来读取每一行。 FileInputREader是您应该避免的低级I / O. 您将字符写入文件而不是字节,最好的方法是使用字符流。 用于写入和读取,除非您需要写入字节/二进制数据。