【问题标题】:How to convert Ascii to Unicode in java?如何在 Java 中将 Ascii 转换为 Unicode?
【发布时间】:2021-08-30 21:09:12
【问题描述】:

我有一个字符串是半号字体,我想将它转换为全号。我尝试使用此代码

final String x = "01589846";
    String b = "";
    System.out.print("01589846");
    int y = 0;
    final char[] list = x.toCharArray();
    for (int i = 0; i < list.length; i++) {
        y = Integer.parseInt(String.valueOf(list[i]));
        final char unicode = (char) (y + 65296);
        b += unicode;

    }
    System.out.println(b);
}

它确实有效,但它只适用于数字。 有人有另一种方法吗?请帮帮我!!!!!!

【问题讨论】:

  • 究竟什么是“半号字体”和“全号”?
  • 仅供参考,Java 中的 char 类型已过时。相反,请使用 Unicode 代码点整数。
  • 他说的可能是半角表格:en.wikipedia.org/wiki/…
  • 代码 sn-p 周围的那些单个刻度线不属于那里。相反,要么将所有行缩进四个空格,要么将块包装在一对三重反引号中。此外,您的最后一个花括号似乎不平衡。
  • @BasilBourque - 在过时的字符上:我想是真的,但有证据表明 OP 只对

标签: java unicode ascii


【解决方案1】:

Java 字符串 Unicode。他们不需要转换。 Java 本身并不使用 ASCII。

您显然希望将一组 Unicode 字符映射到另一组。合适的工具是地图,但您必须使用从Unicode code charts 获取的所需转换来填充地图。

对于特定的子范围,可能有一些算法方法可以做到这一点;您似乎已经发现了一种适用于(西方)数字的方法。请注意,全角数字占用代码点 0xFF10 到 0xFF19,因此转换公式为digit - '0' + 0xff10。 0xFF10 是十进制的 65296,但十六进制更清晰,因为它是已发布的代码图表中使用的。

实际上,在我看来,同样的事情适用于 SPACE 到 '~' 范围内的所有字符,大概是设计使然。因此

for (int i=0; i<list.length; i++)
   list[i] += 0xff00 - ' ';

在这里,我只是假设list 将仅包含 SPACE 到 '~' 范围内的字符,即对应于图形(可打印)ASCII 字符的 Unicode 范围。处理其他角色(例如片假名)的难度更大。

【讨论】:

    【解决方案2】:
    final String x = "012345 abcdef ABCDEF";
    System.out.println(x);
            
    String b = "";
    final char[] list = x.toCharArray();
    for (int i = 0; i < list.length; i++) {
        if(Character.isDigit(list[i])) {
            b += (char)(list[i] - 48 + 0xFF10);
        } else if(Character.isUpperCase(list[i])) {
            b += (char)(list[i] - 65 + 0xFF21);
        } else if(Character.isLowerCase(list[i])) {
            b += (char)(list[i] - 97 + 0xFF41);
        } else if(Character.isWhitespace(list[i])) {
            b += list[i];
        } else {
            b += (char)(list[i] - 33 + 0xFF01);
        }
    }
    System.out.println(b);  
    

    输出:

    012345 abcdef ABCDEF
    012345 abcdef ABCDEF
    

    【讨论】:

    • FWIW,我会编码 '0' 而不是 48 等。我认为这使逻辑更清晰。
    • 此外,此代码错误地将digits outside the range 0-9、A-Z 或 a-z 之外的字母转换。这对于 OP 的用例来说可能没问题——我的答案有类似的未经检查的假设——但我认为值得一提。
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2013-05-17
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多