当前位置: 首页 > 面试题库 >

用Java将UTF-16转换为ASCII

花飞扬
2023-03-14
问题内容

一直以来都忽略了它,我目前正在强迫自己学习有关Java中的unicode的更多信息。我需要做一个关于将UTF-16字符串转换为8位ASCII的练习。有人可以启发我如何用Java做到这一点吗?我知道您无法用ASCII表示所有可能的unicode值,因此在这种情况下,无论如何我都希望仅添加超过0xFF的代码(坏数据也应该仅以静默方式添加)。

谢谢!


问题答案:

这个怎么样:

String input = ... // my UTF-16 string
StringBuilder sb = new StringBuilder(input.length());
for (int i = 0; i < input.length(); i++) {
    char ch = input.charAt(i);
    if (ch <= 0xFF) {
        sb.append(ch);
    }
}

byte[] ascii = sb.toString().getBytes("ISO-8859-1"); // aka LATIN-1

对于大型字符串,这可能不是最有效的转换方法,因为我们将字符复制了两次。但是,它具有简单明了的优点。

顺便说一句,严格来说,没有这样的字符集,例如8位ASCII。ASCII是7位字符集。LATIN-1是最接近“
8位ASCII”字符集的东西(Unicode的块0等效于LATIN-1),所以我假设这就是您的意思。

编辑:根据问题的更新,解决方案甚至更简单:

String input = ... // my UTF-16 string
byte[] ascii = new byte[input.length()];
for (int i = 0; i < input.length(); i++) {
    ascii[i] = (byte) input.charAt(i);
}

解决方案效率更高。因为现在我们知道要期待多少字节,所以我们可以预先分配字节数组并复制(截断的)字符,而无需使用StringBuilder作为中间缓冲区。

但是,我不认为以这种方式处理错误数据是明智的。

编辑2:还有一个晦涩的“陷阱”。Unicode实际上将代码点(字符)定义为“大约21位”值… 0x000000到0x10FFFF
…并使用替代来表示> 0x00FFFF的代码。换句话说,Unicode代码点>
0x00FFFF实际上在UTF-16中表示为两个“字符”。我的回答或任何其他回答都没有考虑到这一点(深奥的)。实际上,在Java中处理>
0x00FFFF的代码点通常比较棘手。这是因为’char’是16位类型,而String是根据’char’定义的。

编辑3:也许处理不转换为ASCII的意外字符更明智的解决方案是用标准替换字符替换它们:

String input = ... // my UTF-16 string
byte[] ascii = new byte[input.length()];
for (int i = 0; i < input.length(); i++) {
    char ch = input.charAt(i);
    ascii[i] = (ch <= 0xFF) ? (byte) ch : (byte) '?';
}


 类似资料:
  • 问题内容: 我们有一个数据输入人员,他在Windows上使用UTF-16编码,并且希望拥有utf-8并删除BOM。utf-8转换有效,但BOM仍然存在。我将如何删除?这是我目前拥有的: 如果我使用hexdump -CI,请参阅: 在结果文件中。如何删除物料清单? 谢谢 问题答案: 只需使用和: 将为您摆脱BOM表(并推断出字节序)。

  • 问题内容: 最近,我阅读了很多有关Unicode代码点的信息,以及它们随着时间的演变,并确保我也阅读了http://www.joelonsoftware.com/articles/Unicode.html。 但是我找不到真正的原因是Java为什么将UTF-16用作字符。 例如,如果我的字符串包含1024个ASCII范围的字母。这意味着等于2KB的字符串内存,它将以任何方式消耗。 因此,如果Java

  • 返回指定UTF-8字符串的16进制表示。 调用: web3.utils.utf8ToHex(string) web3.utils.stringToHex(string) // 别名 web3.utils.fromUtf8(string) // 别名,已弃用 参数: string - String: ·UTF-8字符串 返回值: String: 16进制字符串 示例代码: web3.utils.u

  • 返回指定16进制值的UTF-8字符串表示。 调用: web3.utils.hexToUtf8(hex) web3.utils.hexToString(hex) // 别名 web3.utils.toUtf8(hex) // 别名,已弃用 参数: hex - String: 16进制字符串 返回值: String: UTF-8字符串 示例代码: web3.utils.hexToUtf8('0x49

  • 问题内容: 我们有一个系统,客户(主要是欧洲人)输入的文本(使用UTF-8)必须分发到不同的系统,其中大多数接受UTF-8,但是现在我们还必须将文本分发到仅接受美国的美国系统。 -Ascii 7位 因此,现在我们需要将所有欧洲字符翻译成最近的美国Ascii。是否有任何Java库可帮助完成此任务? 现在,我们刚刚开始添加到转换表中,在该表中Å(瑞典AA)-> A等,在找不到与输入字符匹配的位置的情况

  • 问题内容: 我正在阅读XML文档(UTF-8),并最终使用ISO-8859-1在网页上显示内容。正如预期的那样,有几个字符显示不正确,比如,和(他们显示为?)。 是否可以将这些字符从UTF-8转换为ISO-8859-1? 这是我编写的尝试此功能的代码段: 我不太确定发生了什么问题,但是我认为是re​​adLine()引起了麻烦(因为字符串将是Java / UTF-16编码的?)。我尝试的另一种变化