我目前正在对Shift-JIS格式的输出CSV文件进行一些测试,但不知何故,我发现它在日语字符差异的测试中很奇怪,如下所示:
我的代码:
try {
String dat2 = "カヨ ハラダ";
String dat = "2バイト文字出力";
String fileName = "C:/Users/CR/Desktop/test2.txt";
FileOutputStream fos = new FileOutputStream(fileName);
OutputStreamWriter osw = new OutputStreamWriter(fos, "Shift_JIS");
BufferedWriter fp = new BufferedWriter(osw);
fp.write(new String(dat2.getBytes("Shift_JIS"));
fp.newLine();
fp.flush();
fp.close();
fos.close();
} catch (Exception ex) {
throw new Exception(ex);
}dat2的结果:

它不是Shift-JIS格式的,并且文字也是不正确的,因此另一次试验:
日期的结果:

这可以正确地显示,也可以以预期的格式显示。
出什么问题了吗?还是内容不正确?
谢谢!
发布于 2016-08-24 19:05:32
你的大部分代码都很好,除了下面这一行:
fp.write(new String(dat2.getBytes("Shift_JIS"));Java字符串(或多或少)是编码中立的。当您将字符串写入文件(或通过网络发送)时,编码开始起作用。在您的示例中,编码转换由正确设置的OutputStreamWriter处理。
所以这行代码变得更简单了:
fp.write(dat2);顺便说一句:
表达式
new String(dat2.getBytes("Shift_JIS")首先将字符串dat2转换为Shift_JIS编码的字节数组,然后使用默认编码(可能是UTF-8)将字节数组转换为字符串,从而使用错误的编码解码字节数组。
附注:
还有一件事。像CSV文件这样的文本文件无法指明写入它们时使用的编码(例外:带有BOM的UTF )。只有启发式方法才能做出很好的猜测。因此,当您在文本编辑器中打开它们时,您必须检查它们是否使用正确的编码打开,并在必要时进行修复。在您的第一个屏幕截图中,它在状态栏中显示"ANSI“。这不是你想要的。
发布于 2016-08-25 18:02:23
这个问题似乎是由日语单词引起的-全角或半角片假名字符。
对于上面给出的示例,dat是全宽的,dat2是半宽的。
所以我尝试使用ICU4J将半宽转换为全宽,然后它就可以成功地写入Shift-JIS格式的CSV。
Transliterator transliterator = Transliterator.getInstance("Halfwidth-Fullwidth");
String converted = transliterator.transliterate("カヨ ハラダ");
The result as below :
カヨ ハラダ发布于 2018-02-08 00:07:04
我已经运行了以下程序:
import java.io.*;
public class Hoge {
public static void main(String[] args) {
try {
{
String dat = "2バイト文字出力";
String fileName = "./FullWidth.txt";
FileOutputStream fos = new FileOutputStream(fileName);
OutputStreamWriter osw = new OutputStreamWriter(fos, "Shift_JIS");
BufferedWriter fp = new BufferedWriter(osw);
fp.write(new String(dat.getBytes("Shift_JIS")));
fp.newLine();
fp.flush();
fp.close();
fos.close();
}
{
String dat2 = "カヨ ハラダ";
String fileName = "./HalfWidth.txt";
FileOutputStream fos = new FileOutputStream(fileName);
OutputStreamWriter osw = new OutputStreamWriter(fos, "Shift_JIS");
BufferedWriter fp = new BufferedWriter(osw);
fp.write(new String(dat2.getBytes("Shift_JIS")));
fp.newLine();
fp.flush();
fp.close();
fos.close();
}
} catch (Exception ex) {
// NOP
}
}
}FullWidth.txt的内容是(十六进制):
3F 51 3F 6F 3F 43 3F 67 3F 3F 3F 3F 3F 6F 3F 3F 0AShift JIS编码中的字符串2バイト应为82 51 83 6F 83 43 83 67。因此,我认为Notepad++将编码识别为Shift JIS,并以某种方式恢复了每个字符的第一个字节。
另一方面,HalfWidth.txt的内容是(十六进制):
3F 3F 20 3F 3F 3F 3F 0A所以我认为Notepad++无法识别这个文件的编码。
简而言之:两个文件都是错误的。意外地,Notepad++可以恢复一个文件的内容,但无法恢复另一个文件的内容。
https://stackoverflow.com/questions/39121352
复制相似问题