首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java编写Shift-JIS CSV格式文件

Java编写Shift-JIS CSV格式文件
EN

Stack Overflow用户
提问于 2016-08-24 18:54:49
回答 3查看 4K关注 0票数 0

我目前正在对Shift-JIS格式的输出CSV文件进行一些测试,但不知何故,我发现它在日语字符差异的测试中很奇怪,如下所示:

我的代码:

代码语言:javascript
复制
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格式的,并且文字也是不正确的,因此另一次试验:

日期的结果:

这可以正确地显示,也可以以预期的格式显示。

出什么问题了吗?还是内容不正确?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2016-08-24 19:05:32

你的大部分代码都很好,除了下面这一行:

代码语言:javascript
复制
    fp.write(new String(dat2.getBytes("Shift_JIS"));

Java字符串(或多或少)是编码中立的。当您将字符串写入文件(或通过网络发送)时,编码开始起作用。在您的示例中,编码转换由正确设置的OutputStreamWriter处理。

所以这行代码变得更简单了:

代码语言:javascript
复制
    fp.write(dat2);

顺便说一句:

表达式

代码语言:javascript
复制
new String(dat2.getBytes("Shift_JIS")

首先将字符串dat2转换为Shift_JIS编码的字节数组,然后使用默认编码(可能是UTF-8)将字节数组转换为字符串,从而使用错误的编码解码字节数组。

附注:

还有一件事。像CSV文件这样的文本文件无法指明写入它们时使用的编码(例外:带有BOM的UTF )。只有启发式方法才能做出很好的猜测。因此,当您在文本编辑器中打开它们时,您必须检查它们是否使用正确的编码打开,并在必要时进行修复。在您的第一个屏幕截图中,它在状态栏中显示"ANSI“。这不是你想要的。

票数 1
EN

Stack Overflow用户

发布于 2016-08-25 18:02:23

这个问题似乎是由日语单词引起的-全角或半角片假名字符。

对于上面给出的示例,dat是全宽的,dat2是半宽的。

所以我尝试使用ICU4J将半宽转换为全宽,然后它就可以成功地写入Shift-JIS格式的CSV。

代码语言:javascript
复制
Transliterator transliterator = Transliterator.getInstance("Halfwidth-Fullwidth");
String converted = transliterator.transliterate("カヨ ハラダ"); 

The result as below :
カヨ ハラダ
票数 0
EN

Stack Overflow用户

发布于 2018-02-08 00:07:04

我已经运行了以下程序:

代码语言:javascript
复制
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的内容是(十六进制):

代码语言:javascript
复制
3F 51 3F 6F 3F 43 3F 67 3F 3F 3F 3F 3F 6F 3F 3F 0A

Shift JIS编码中的字符串2バイト应为82 51 83 6F 83 43 83 67。因此,我认为Notepad++将编码识别为Shift JIS,并以某种方式恢复了每个字符的第一个字节。

另一方面,HalfWidth.txt的内容是(十六进制):

代码语言:javascript
复制
3F 3F 20 3F 3F 3F 3F 0A

所以我认为Notepad++无法识别这个文件的编码。

简而言之:两个文件都是错误的。意外地,Notepad++可以恢复一个文件的内容,但无法恢复另一个文件的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39121352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档