如何在 java 中将西里尔文本编码为中文 GB2312?

How to encode cyrillic text to Chinese GB2312 in java?

我正在尝试使用汉字编码器 GB2312 保存文本文件。根据 this 文档,GB2312 支持西里尔字符。不幸的是,java 无法以 GB2312 编码保存西里尔字符。我使用了下面的代码。

问:java的编码器是不是完全支持所有GB2312支持的字符? 如何查看特定编码器中所有支持的字符?

Files.write(Path.of("output_gb2312.txt"), List.of("АБВГДЕЁЖЗИЙКЛМНОӨПРСТУҮФХЦЧШЩЪЫЬЭЮЯ"), Charset.forName("GB2312"));

输出:

Exception in thread "main" java.nio.charset.UnmappableCharacterException: Input length = 1
    at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:275)
    at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:307)
    at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282)
    at java.base/sun.nio.cs.StreamEncoder.write(StreamEncoder.java:132)
    at java.base/java.io.OutputStreamWriter.write(OutputStreamWriter.java:205)
    at java.base/java.io.BufferedWriter.flushBuffer(BufferedWriter.java:120)
    at java.base/java.io.BufferedWriter.close(BufferedWriter.java:268)
    at java.base/java.nio.file.Files.write(Files.java:3587)

字符 Ө (U+04E8 CYRILLIC CAPITAL LETTER BARRED O) 和 ͮ (U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U) 不属于 GB 2312 字符集。从您的字符串中删除它们,您的代码将起作用。

Files.write(Path.of("output_gb2312.txt"), List.of("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"), Charset.forName("GB2312"));

或者,如果您的 java 安装支持,GB 2312 的替代 GB 18030 将处理这两个字符(以及其余的 Unicode)。

或者你可以设置一些东西来替换不可映射的字符而不是抛出异常,尽管它比使用 Files.write():

更麻烦
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CodingErrorAction;

public class Demo {
    public static void main(String[] args) {
        Charset gb2312 = Charset.forName("GB2312");
        // REPLACE is already the default but let's be explicit
        CharsetEncoder enc = gb2312.newEncoder().onUnmappableCharacter(CodingErrorAction.REPLACE);   
        try (FileOutputStream f = new FileOutputStream("output_gb2312.txt");
             BufferedWriter out = new BufferedWriter(new OutputStreamWriter(f, enc))) {
            out.write("АБВГДЕЁЖЗИЙКЛМНОӨПРСТУҮФХЦЧШЩЪЫЬЭЮЯ");
            out.newLine(); 
        } catch (IOException e) {
            System.err.println(e);
            System.exit(1);
        }
    }
}

有关如何处理不可映射字符的可用选项,请参阅 CodingErrorAction 文档。