如果您的输入文件包含一些不受支持的字符会发生什么?

时间:2012-06-04 22:44:35

标签: java character-encoding latin1

我有这个文本文件,其中可能包含Latin1字符集中的一些不受支持的字符,这是我的JVM的默认字符集。

当我的java程序试图从文件中读取时,这些字符会变成什么? 具体地说,假设我在文件中有一个2字节长的字符,它是否会被读作单字节字符(因为Latin1中的每个字符只有1个字节长)?

谢谢,

3 个答案:

答案 0 :(得分:3)

  

我无法使用InputStreaReader选项,因为必须使用Latin1读取该文件。

并且

  

我有这个文本文件,其中可能包含Latin1字符集中的一些不受支持的字符...

这里你有相互矛盾的要求。

文件是LATIN-1(并且没有“不支持的字符”)或者它不是LATIN-1。如果它不是LATIN-1,你应该试着找出它真正的字符集/编码,并使用那个而不是LATIN-1来读取文件。

正如其他答案/评论所解释的那样,您可以更改JVM的默认字符集,也可以在打开Reader时明确指定字符集。

  

我在设置JVM的默认字符集时遇到问题。

请解释您正在尝试的内容以及您遇到的问题。

  

(并且有点害怕弄乱它!)

胆小鬼! : - )


FWIW - 如果您尝试读取(比如)LATIN-1中的数据流且数据流实际上不在LATIN-1中,那么您可以期待以下内容:

  • 在LATIN-1中编码相同字符的字符和实际字符集将无损地传递。
  • 不对其编码的字符将被替换为表示“未知字符”(例如问号)的字符,或者将是乱码。发生的情况取决于该字节或字节序列是否编码有效(但错误)的字符,或者根本没有字符。

最终结果将是部分乱码文本。根据真实字符集和字符的确切含义,拼接可能是可逆的,也可能是不可逆的。但最好避免“去那里”......通过在第一个实例中使用RIGHT字符集进行解码。

答案 1 :(得分:1)

首先,您可以指定在读取文件时使用的字符集。例如,请参阅:java.io.InputStreamReader

其次。是,如果使用1字节字符集进行读取,则每个字节将用于映射到一个字符。

第三:测试它,你将毫无疑问地看到实际发生的事情!

答案 2 :(得分:0)

如果你不知道这个字符集你就必须猜测它。这很棘手且容易出错。

以下是有关此问题的问题: How can I detect the encoding/codepage of a text file

看看如何欺骗记事本猜错。