0

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

问: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)
4

1 回答 1

0

字符 Ө (U+04E8 西里尔大写字母 BARRED O) 和 Ү (U+04AE 西里尔大写字母 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有关如何处理不可映射字符的可用选项,请参阅文档。

于 2022-02-19T10:04:57.887 回答