如何以UTF-8格式打开文件并以UTF-16格式写入另一个文件

3

如何打开一个UTF-8编码的文件并将其写入到另一个UTF-16编码的文件中?

我需要一个示例,因为我在处理一些字符(如'é'和'a')时遇到了问题。

当写入“médic”时,我发现在文件中写入了“m@#dic”。


2
你确定这是你真正的问题吗?这不是你的控制台不支持UTF-8吗?我不相信UTF-16会解决问题... - fge
3个回答

4
您可以按照以下方式创建读取器:
InputStream is = new FileInputStream(inputFile);
InputStreamReader in = new InputStreamReader(is, "UTF-8");

and a writer as follows:

OutputStream os = new FileOutputStream(outputFile);
OutputStreamWriter out = new OutputStreamWriter(os, "UTF-16");

3

请执行以下操作:

try (
    final BufferedReader reader = Files.newBufferedReader(srcpath,
        StandardCharsets.UTF_8);
    final BufferedWriter writer = Files.newBufferedWriter(dstpath,
        StandardCharsets.UTF_16BE);
) {
    final char[] buf = new char[4096];
    int nrChars;
    while ((nrChars = reader.read(buf)) != -1)
        writer.write(buf, 0, nrChars);
    writer.flush();
}

注意:选择大端UTF-16。您没有说明想要哪种。如果您想使用小端,请改用UTF_16LE

此外,如果您想跳过bom,只需:

reader.read();

在循环写字符之前,BOM是一个恰好在BMP中的单个码点,所以这将起作用。


谢谢!如何将其设置为小端序(仅限无BOM)? - Mohamed Benmahdjoub
请再次阅读我对你最初问题的评论,你确定这是你真正的问题吗? - fge
代码在Linux上可以运行,但在Windows上无法运行,但我仍然需要知道如何选择UTF-16 Little Endian(无BOM)。 - Mohamed Benmahdjoub
我提供两个解决方案。再次确认,这是您真正的问题吗? - fge

0

补充fge在评论中提到的,我认为在写出时更改编码不是你的问题。 我猜测你读取的文件不是UTF-8格式。 以十六进制模式使用像PsPad这样的编辑器打开该文件,并查看文件的前两个或三个字节以获取字节顺序标记(BOM)。 如果它具有UTF-8 BOM,则我是错误的。 如果根本没有BOM,则该文件可能处于操作系统的默认编码而不是UTF-8。 如果没有BOM,则通常可以通过查看ASCII范围之外的字符并查看实际字节来验证编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接