将文件从ISO 8859-6转换为UTF-8后无法看到阿拉伯字符

时间:2014-08-29 09:18:51

标签: java utf-8 character-encoding

在我的应用程序中,我正在阅读一个包含一些阿拉伯字符(编码为ISO 8859-6)的文件,我将其转换为UTF-8编码并使用BufferedWriter将其写回新文件。但是,在我新生成的文件中,我无法看到阿拉伯字符,相反很少会出现问号。

我原始文件中的代码段

Sample Data//لمند
Another line,
One more line/لمند

生成的文件中的片段

 Sample Data//????
 Another line,
 One more line/????

我使用以下方法进行转换:

private String convertCharSet(String data, String sourceCharacterCode, String destinationCharacterCode) throws UnsupportedEncodingException
{
        Charset charsetSource = Charset.forName(sourceCharacterCode);
        Charset charsetDestination = Charset.forName(destinationCharacterCode);
        ByteBuffer inputByteBuffer = ByteBuffer.wrap(data.getBytes(sourceCharacterCode));
        CharBuffer charBuffer = charsetSource.decode(inputByteBuffer);
        ByteBuffer outputByteBuffer = charsetDestination.encode(charBuffer);
        return new String(outputByteBuffer.array(), destinationCharacterCode);
}

我使用以下方法写入文件

public static void writeToFile(String filePath, String data) throws IOException
{
    BufferedWriter out = null;
    try
    {
        out = new BufferedWriter(new FileWriter(new File(filePath)));
        out.write(data);
        out.flush();
    }
    finally
    {
        out.close();
    }
}

观察

  1. notepad++中,我以ISO 8859-6格式打开了文件,我可以 看到阿拉伯字符。我使用UTF-8选项将其转换为Convert to UTF-8,转换后我可以看到阿拉伯字符。

  2. 我已经在eclipse调试了我的程序,在转换之前我可以看到阿拉伯字符,转换为UTF-8后我也可以看到阿拉伯字符。但是一旦将内容写入文件,我就会得到?个标记而不是阿拉伯字符。

  3. 注意

    • 在eclipse中,我使用-Dfile.encoding=ISO-8859-6作为虚拟 论点。
    • 我见过ISO-8859-6 to UTF-8,但事实并非如此 解决我的问题。

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

在Java(与其他语言相对)文本中,String/Char/Reader/Writer是Unicode,能够组合所有脚本。

因此转换必须不是在字符串之间,而是在字符串和二进制数据之间进行,byte[]/InputStream/OutputStream

Path sourcePath = Paths.get("C:/data/arab.txt");
byte[] sourceData = Files.readAllBytes(sourcePath);

String s = new String(sourceData, "ISO-8859-6");

byte[] targetData = s.getBytes(StandardCharsets.UTF_8);
Files.write(targetData, targetPath, StandardOpenOption.REPLACE_EXISTING);

正如你所看到的,它在java中很容易理解 - 一旦有人知道。

FileWriter / FileReader是旧的实用程序类,它使用默认的平台编码。不便携。仅适用于本地文件。


在java 1.6中(没有异常处理):

File sourceFile = ...
File targetFile = ...
BufferedReader in = new BufferedReader(new InputStreamReader(
        new FileInputStream(sourceFile), "ISO-8859-6"));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
        new FileOuputStream(targetFile), "UTF-8"));
for (;;) {
    String line = in.readLine();
    if (line == null) {
        break;
    }
    out.write(line);
    out.write("\r\n"); // Windows CR+LF.
}
out.close();
in.close();

答案 1 :(得分:0)

writeToFile方法被破坏了。您正在打开一个非显式Writer而未指定编码。将使用标准平台编码。你的文件将被破坏。使用接受一种编码的Writer