在java中读取unicode字符

时间:2010-09-02 19:42:22

标签: java file 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字符。如果我想将文件打印为正在打印的字符串,我该怎么办呢。

8 个答案:

答案 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.PropertiesloadConvert()方法可以完成此操作,但它是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.您将字符写入文件而不是字节,最好的方法是使用字符流。用于写入和读取,除非您需要写入字节/二进制数据。