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

Java 将文件从ISO 8859-6转换为UTF-8后无法看到阿拉伯语字符,java,utf-8,character-encoding,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/???? 我使

在我的应用程序中,我正在读取一个包含一些阿拉伯字符的文件(编码为
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();
    }
}
观察结果

  • notepad++
    中,我以
    iso8859-6
    格式打开了文件,我可以 请看阿拉伯字符。我使用
    Convert to UTF-8
    选项将其转换为
    UTF-8
    ,在那里我可以看到转换后的阿拉伯字符

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

  • 注意

    • 在eclipse中,我使用
      -Dfile.encoding=ISO-8859-6
      作为虚拟 争论
    • 我见过,但那不是 解决我的问题
    非常感谢您的帮助。

    在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中(无异常处理):

    在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中(无异常处理):


    您的
    writeToFile
    方法已损坏。您正在打开imlicit
    编写器,但未指定编码。将使用标准平台编码。你的文件将被破坏。使用接受一种编码的
    编写器。

    您的
    writeToFile
    方法被破坏。您正在打开imlicit
    编写器,但未指定编码。将使用标准平台编码。你的文件将被破坏。使用接受一种编码的
    编写器。

    非常感谢您的回答。但是我有一个使用Java1.6的限制。有没有办法用1.6实现同样的效果?我遵循了你的BufferedReader。优点:非常大的文件可以分块逐行读写。非常感谢+谢谢你这么好的回答。非常感谢你的回答。但是我有一个使用Java1.6的限制。有没有办法用1.6实现同样的效果?我遵循了你的BufferedReader。优点:非常大的文件可以分块逐行读写。非常感谢+谢谢你这么好的回答。