【问题标题】:Java String Unicode ValueJava 字符串 Unicode 值
【发布时间】:2011-08-09 16:30:56
【问题描述】:

如何在java中获取字符串的unicode值?

例如,如果字符串是“Hi” 我需要类似\uXXXX\uXXXX

【问题讨论】:

  • 为什么? 究竟你想做什么? charAt() 会有所帮助。如果您想要 Unicode 代码点而不是 UTF-16 代码单元,那么 codePointAt() 是更正确的方法(但如果您想为 Java 源代码或类似代码编写 \u 转义符,那将无济于事。
  • 为了简化一切,我有一个来自 java 源文件的英文字符串。它被转换为日语。然后我需要 \uXXXX unicode 值,因为英文字符串将被源文件中的日文替换。
  • @user:在这种情况下,将charAt() 返回的值格式化为 4 位十六进制数字并在前面加上 \u 应该可以工作。

标签: java string unicode


【解决方案1】:

一些 unicode 字符跨越两个 Java 字符。来自http://docs.oracle.com/javase/tutorial/i18n/text/unicode.html 的引用:

值在 16 位范围之外且在 0x10000 到 0x10FFFF 范围内的字符称为补充字符,定义为一对 char 值。

转义非ascii的正确方法:

private static String escapeNonAscii(String str) {

  StringBuilder retStr = new StringBuilder();
  for(int i=0; i<str.length(); i++) {
    int cp = Character.codePointAt(str, i);
    int charCount = Character.charCount(cp);
    if (charCount > 1) {
      i += charCount - 1; // 2.
      if (i >= str.length()) {
        throw new IllegalArgumentException("truncated unexpectedly");
      }
    }

    if (cp < 128) {
      retStr.appendCodePoint(cp);
    } else {
      retStr.append(String.format("\\u%x", cp));
    }
  }
  return retStr.toString();
}

【讨论】:

    【解决方案2】:

    此方法将任意 String 转换为 ASCII 安全表示,以在 Java 源代码(或属性文件,例如)中使用:

    public String escapeUnicode(String input) {
      StringBuilder b = new StringBuilder(input.length());
      Formatter f = new Formatter(b);
      for (char c : input.toCharArray()) {
        if (c < 128) {
          b.append(c);
        } else {
          f.format("\\u%04x", (int) c);
        }
      }
      return b.toString();
    }
    

    【讨论】:

    • @user489041:我不同意:正确的做法是使用java -encoding UTF-8 进行编译。没有混乱,没有大惊小怪。这尤其是因为 20 年过去了,Java 仍然没有标准的方式来用他们的官方名称来谈论代码点。这意味着您正试图在代码中插入邪恶而神秘的幻数。那可不是什么好事!当然,我可能更愿意看到“\N{GREEK SMALL LETTER ALPHA}”而不是“α”,但我肯定不想看到“\u03B1”!这简直是​​邪恶的。你将如何保持这种克鲁多拉?
    • 只有 4 位数字? Unicode 是 32 位字符集,而 OP 说的是日语。
    • @Martin: 1.) 严格来说,“Unicode”不是任何 n 值的 n 位字符集。 2.) 大多数日文字符属于基本的多语言窗格(前 64k Unicode 代码点),并且可以仅用 4 个十六进制数字表示,并且 3.) Java 中的 unicode 转义使用 UTF-16,所以如果你必须在外面展示任何东西BMP,您必须使用两个 \u 转义(具有正确的代理值),这是我的代码所做的,因为 char 实际上是 UTF-16 代码点而不是 Unicode 代码点(这两个是相同的事情,iff 字符在 BMP 中)。
    • 我用它来混淆一些字符串(是的,只是让它们难以阅读)
    • @JoachimSauer 谢谢伙计。它就像一个魅力。请告诉我当我从服务器返回时如何解码此消息。这就是它返回的“\ud83d\ude1c”。
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 2013-04-03
    • 2010-11-01
    • 2015-06-15
    • 1970-01-01
    • 2020-11-09
    • 2016-03-26
    • 2014-07-21
    相关资源
    最近更新 更多