Encoding 如何将在字符集UTF8中创建的数据作为字符集Shift JIS写入文件而不丢失字符

Encoding 如何将在字符集UTF8中创建的数据作为字符集Shift JIS写入文件而不丢失字符,encoding,utf-8,shift-jis,Encoding,Utf 8,Shift Jis,我正在通过查询数据表单DB创建文件,并使用它创建文件,情况如下: 数据库:带有字符集UTF8的Oracle 应用服务器:带字符集UTF8的树脂 应用程序框架:NTT Intra-Mart(一个基于Rihno并使用javascript作为服务器程序语言的日语框架) 需要:从Oracle查询数据并使用字符集[Shift JIS]创建文件,该文件用作中间文件,由一个系统导出,并使用FTP传输到另一个系统进行导入。 文件需要具有固定的字节范围,目标服务器才能找到要导入的指定数据: 例如 字节1-10:[

我正在通过查询数据表单DB创建文件,并使用它创建文件,情况如下: 数据库:带有字符集UTF8的Oracle 应用服务器:带字符集UTF8的树脂 应用程序框架:NTT Intra-Mart(一个基于Rihno并使用javascript作为服务器程序语言的日语框架) 需要:从Oracle查询数据并使用字符集[Shift JIS]创建文件,该文件用作中间文件,由一个系统导出,并使用FTP传输到另一个系统进行导入。 文件需要具有固定的字节范围,目标服务器才能找到要导入的指定数据: 例如 字节1-10:[用户地址] 字节11-20:[用户名] 但是,首先我使用UTF8创建文件,似乎所有字符都显示正确,但当我尝试使用字符集[SJIS]写入数据时,有些全宽字符变成半宽问号[?],这可能导致字节宽度缩短,无法正确获取数据: 例如 当[用户地址]的数据如:1-10-1时,文件中的数据将变为1-10-1 字节1-10:[用户地址],但在当前文件中,用户地址是字节1-8 字节11-20:[用户名]
您能给我一些建议吗?

您必须使用字符集名称
Windows-31J
,而不是
Shift-JIS

数据
1-10-1
将从Microsoft IME中键入。Microsoft IME用于
U+FF0D
(全宽连字符减号)来表示字符
-

  • U+FF0D
    未映射到JavaVM中Shift-JIS-Unicode映射中的任何字符。因此,当您将JVM内部表示(UTF-16)中的
    -
    转换为带有字符集的Shift JIS时,您将得到
  • U+FF0D
    在Windows-31J中映射到
    0x817C
    ,在JavaVM中映射到Unicode。因此,当您将JVM内部表示(UTF-16)中的
    -
    转换为带有字符集
    Windows-31J
    的Shift JIS时,您将得到
    -

您必须使用字符集名称
Windows-31J
,而不是
Shift-JIS

数据
1-10-1
将从Microsoft IME中键入。Microsoft IME用于
U+FF0D
(全宽连字符减号)来表示字符
-

  • U+FF0D
    未映射到JavaVM中Shift-JIS-Unicode映射中的任何字符。因此,当您将JVM内部表示(UTF-16)中的
    -
    转换为带有字符集的Shift JIS时,您将得到
  • U+FF0D
    在Windows-31J中映射到
    0x817C
    ,在JavaVM中映射到Unicode。因此,当您将JVM内部表示(UTF-16)中的
    -
    转换为带有字符集
    Windows-31J
    的Shift JIS时,您将得到
    -

Shift JIS编码不能表示UTF-8可以表示的所有代码点。UTF-8可以表示整个Unicode代码点范围。Shift-JIS编码不能表示UTF-8可以表示的所有代码点。UTF-8可以代表整个Unicode范围的代码点。感谢您的建议,我已经与SE进行了沟通,现在我们已经放弃了使用指定字节读取文件并使用CSV文件来执行此操作的方式。感谢您的建议,我已经与SE进行了沟通,现在我们已经放弃了使用指定字节读取文件的方式,而使用CSV文件来实现这一点。