- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用的变量:
给定此字符串输入 ピーター・ジョーズ
它以 UTF-8 编码,我在将所述字符串转换为 Shift-JIS 时遇到问题,而无需将所述数据写入文件。
ピーター・ジョーンズ
ピーター・ジョーンズ
(要编码的SHIFT-JIS)我已经尝试过以下代码片段,了解如何将 UTF-8 字符串转换为 SHIFT-JIS:
stringToEncode.getBytes(Charset.forName("SHIFT-JIS"))
new String(unecodedString.getBytes("SHIFT-JIS"), "UTF-8")
两个代码片段都返回此字符串输出:�s�[�^�[�E�W���[���Y
(SHIFT-JIS 编码)
关于如何解决这个问题有什么想法吗?
最佳答案
在 Java 内部,字符串被实现为 UTF-16 代码单元的数组。但这是一个实现细节,可以实现内部使用不同编码的 JVM。
(注意“编码”、“字符集”和字符集或多或少是同义词。)
字符串应被视为 Unicode 代码点序列(即使在 Java 中它是 UTF-16 代码单元序列)。
如果 Java 程序中有一个字符串,说它是“UTF-8 字符串”或“以 UTF-8 编码的字符串”是不正确的。这没有任何意义,除非你谈论的是无关紧要的内部表示。
如果使用编码(例如 UTF-8 或 Shift-JIS)对其进行解码,您可以获得的是解码为字符串的字节序列。
或者,如果您使用某种编码(例如 UTF-8 或 Shift-JIS)对其进行编码,则可以将字符串编码为字节序列。
简而言之,编码或字符集是两个函数的对,“编码”和“解码”,这样:
// String -> encode -> bytes
byte[] bytes = string.getBytes(encoding);
// or using Charset
ByteBuffer byteBuffer = charset.encode(string);
// bytes -> decode -> String
String string = new String(bytes, encoding);
// or using Charset
String string = charset.decode(byteBuffer).toString();
因此,如果您有一个使用 UTF-8 编码的 byte[]:
byte[] utf8Bytes = "ピーター・ジョーズ".getBytes("UTF-8");
// utf8Bytes now contains, in hexadecimal
// e3 83 94 e3 83 bc e3 82 bf (ピ ー タ)
// e3 83 bc e3 83 bb e3 82 b8 (ー ・ ジ)
// e3 83 a7 e3 83 bc e3 82 ba (ョ ー ズ)
您可以使用这些字节创建一个字符串:
String string = new String(utf8Bytes, "UTF-8");
// String now contains "ピーター・ジョーズ"
然后您可以使用以下方法将该字符串编码为 Shift-JIS:
byte[] shiftJisBytes = string.getBytes("Shift-JIS");
// shiftJisBytes now contains, in hexadecimal
// 83 73 81 5b 83 5e (ピ ー タ)
// 81 5b 81 45 83 57 (ー ・ ジ)
// 83 87 81 5b 83 59 (ョ ー ズ)
由于这些字节表示使用 Shift-JIS
编码的字符串,因此尝试使用 UTF-8
解码将产生垃圾:
String garbage = new String(shiftJisBytes, "UTF-8")
// String now contains "�s�[�^�[�E�W���[�Y"
// � is the character decoded when given an invalid UTF-8 sequence
// 83 73 81 5b 83 5e (� s � [ � ^)
// 81 5b 81 45 83 57 (� [ � E � W)
// 83 87 81 5b 83 59 (� � � [ � Y)
此外,请记住,如果将字符串打印到输出(例如 System.out
),则将使用与系统相关的系统默认编码将字符串转换为字节。您的系统默认值似乎是 UTF-8
。
System.out.print(string);
// equivalent to:
System.out.write(string.getBytes(Charset.defaultCharset()));
然后,如果您的输出例如是 Windows 控制台,它会使用很可能完全不同的编码(可能是 CP437
或 CP850
)将这些字节转换为字符串在将其呈现给您之前。
最后一部分可能会让您绊倒。
关于java - 字符串编码转换 UTF-8 到 SHIFT-JIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37155417/
我目前正在使用 Shift-JIS 格式的输出 CSV 文件进行一些测试,但不知何故,我发现在日语字符差异的试验中很奇怪,如下所示: 我的代码: try { String dat2 =
我尝试了很多方法将 MySQL 列中的 utf8_unicode_ci 值从 utf8_unicode_ci 转换为 shift_jis 但它不是得到修复。 原始列值在 shift_jis 中,并在使
我必须存储从互联网上获取的以 Shift-JIS 格式编写的日语名称序列。我正在考虑将它们存储在字符数组中并将它们写入一个文件,例如: fprintf(fp,"The name is [%s]\n",
如何在 android 中解码 shift-JIS(将其转换为字符串)? 我尝试过类似的方法,但它不起作用 编码: String test = "some text"; byte[] bytes =
在 Java 中,我正在从以 Shift-JIS 格式编码的文件中读取字节数组,但获取的字符串中字符的“样式”看起来与普通字符串不同(更宽?)。以下是我对“P”字母含义的示例: P - P 正如您所看
在运行一个小型 vba 应用程序时,我想检查某个名称是否存在,例如エンジン回転数 通过简单地将单元格值与预定义的字符串匹配而出现在我的表格中。 如何在 VBA 中存储此字符串エンジン回転数?我的第一个
这怎么可能?这是一个错误吗? (Python 2.7.12 和 Python 3.5.1 中的行为相同。) In [1]: yen = u'\u00A5' In [2]: print(yen) ¥ I
在 net45 中,Encoding.GetEncoding("Shift-JIS") 工作正常,但在 netstandard 下它会抛出: System.ArgumentException : 'S
我有一个程序,其中我使用 TextOut() 在屏幕上打印普通的 ASCII 字符串。我现在想添加打印 Shift-JIS 编码字符串的功能。我可以以某种方式告诉 TextOut() 我想打印 Shi
我目前在一个有两个版本的网站上工作,一个美国网站使用 utf-8,另一个日本版本使用 Shift JIS。该站点是使用 Perl 生成的。 问题: 我正在提供类似于以下内容的 Javascript。
我正在尝试解码 shift-jis 编码的字符串,如下所示: string.decode('shift-jis').encode('utf-8') 能够在我的程序中查看它。 当我遇到 2 个 shif
当前电子邮件为 UTF-8。它不适用于 Shift-JIS。 如何从 UTF-8 转换为 SHIFT-JIS。解决方案需要是 PHP 解决方案。 这是我目前的尝试 $subject = mb_conv
我正在尝试读取以实用方式下载和提取的日语内容 CSV 文件。 读取CSV的代码 String splitBy = ","; BufferedReader br;// = n
我编写了简单的转换代码,将 UTF-8 转换为日语字符。 private static String convertUTF8ToShiftJ(String uft8Strg) {
我正在从 Aozora Bunko 获取 html 源代码. Html 文件是 Shift-JIS 编码的。我正在尝试获取书名和作者。然后我想将标题和作者记录到 SQLite(UTF-8) 数据库中。
使用的变量: JavaSE-6 没有框架 给定此字符串输入 ピーター・ジョーズ它以 UTF-8 编码,我在将所述字符串转换为 Shift-JIS 时遇到问题,而无需将所述数据写入文件。 输入(UTF-
我有一个包含四个日文字符的 Unicode 字符串,我正在使用 WideCharToMultiByte 将其转换为指定 Shift-JIS 代码页 932 的多字节字符串。为了获得所需缓冲区的大小,我
我正在尝试读取包含一些日语文本的 CSV 文件,并将该文件中的一些数据写入数据库。 CSV 是通过一些我不太熟悉的 Flex 代码上传的。但在我的后端,我有简单的 byte[] 和文件内容。我正在使用
我正在处理日语文件,但我对此语言一无所知。该文件采用 S-JIS 编码。现在,我应该将内容转换为 UTF-8,以便内容看起来像日语。而我在这里完全一片空白。我尝试了在互联网上找到的以下代码,但没有成功
如何在 C++ 中将 JIS X 208 编码字符串转换为 UNICODE? VC++ 特定的答案会有所帮助。 我发现难以理解的更大问题是日语字符的编码太多。 JIS本身有很多版本,然后就是Shift
我是一名优秀的程序员,十分优秀!