【问题标题】:Java equivalent for .charCodeAt().charCodeAt() 的 Java 等效项
【发布时间】:2012-12-15 18:33:39
【问题描述】:

在 JavaScript 中,.charCodeAt() 在您传递给函数的字符串中的某个点返回一个 Unicode 值。如果我只有一个字符,我可以使用下面的代码来获取 Java 中的 Unicode 值。

public int charCodeAt(char c) {
     int x;
     return x = (int) c;
}

如果我在 Java 中有一个字符串,我将如何获取字符串中单个字符的 Unicode 值,就像 .charCodeAt() 函数对 JavaScript 所做的那样?

【问题讨论】:

  • 哇,一个合法地标记了javajavascript 的问题!
  • 谁告诉你 Unicode 是 24 位 ??
  • 第一个链接,我的错。在 Google 中快速搜索后,我学会了仔细检查随机人提供给您的事实。

标签: java javascript string unicode porting


【解决方案1】:

Java也有同样的方法:Character.codePointAt(CharSequence seq, int index);

String str = "Hello World";
int codePointAt0 = Character.codePointAt(str, 0);

【讨论】:

  • 与使用int value = str.charAt(index);有任何性能差异
  • 是的,它比较慢。但它甚至适用于 4 字节字符,它由一个高代理和低代理组成,而你的不会。你可以随时look at the implementation
  • 那么你的函数会更适合加密,@jlordo?
  • 你必须定义更好。我要说的是,它将为每个字符返回正确的代码点,而不仅仅是大多数字符。
  • 比,是的。它可以处理每个字符。阅读文档。我已将它们链接起来 ;) 对于代理项对,您必须指定高代理项的索引。
【解决方案2】:

试试这个:

public int charCodeAt(String string, int index) {
    return (int) string.charAt(index);
}

【讨论】:

  • 这在大多数情况下都是正确的,但对于由高代理和低代理表示的字符则不然。
【解决方案3】:

有一种方法可以过滤您需要的特殊字符。只需检查ASCII

希望对你有帮助

public class main {

public  static void main(String args[]) {
    String str = args[0];
    String bstr = "";
    String[] codePointAt = new String[str.length()];

    if (str != "") 
    {
        for (int j = 0; j < str.length(); j++) 
        {
            int charactercode=Character.codePointAt(str, j);
            //CHECK on ASCII TABLE THE SPECIAL CHARS YOU NEED
            if(     (charactercode>31 && charactercode<48) ||
                    (charactercode>57 && charactercode<65) ||
                    (charactercode>90 && charactercode<97) ||
                    (charactercode>127)

                )
            {
                codePointAt[ j] ="&"+String.valueOf(charactercode)+";";
            }
            else
            {
                codePointAt[ j] =  String.valueOf( str.charAt(j) );
            }
        }

        for (int j = 0; j < codePointAt.length; j++) 
        {
            System.out.println("CODE "+j+" ->"+ codePointAt[j]);
        }

    }   
 }

}

输出

call with ("TRY./&asda")

CODE 0 ->T
CODE 1 ->R
CODE 2 ->Y
CODE 3 ->&46;
CODE 4 ->&47;
CODE 5 ->&38;
CODE 6 ->a
CODE 7 ->s
CODE 8 ->d
CODE 9 ->a

【讨论】:

  • 将文本作为参数发送到主函数!!我忘了给它建议!
【解决方案4】:
short unicode = string.charAt(index);

【讨论】:

  • @Android Killer 是的,现在可以了,但正如@-jlordo 所指出的那样——是的,其他值将 b >127 的字符呢
  • @jlordo 好的,谢谢你让我更正,我把它改成了短的。
  • 现在它在大多数情况下都是正确的,但对于由高和低代理表示的字符则不是。
  • 为什么要将 char 分配给 short? Char 和 short 都是 16 位类型,但 char 是无符号的,而 short 是有符号的。这意味着当将 char 转换为 short 时,您不会丢失任何信息,但您会得到负数而不是正数,这可能不是您所期望的。由于 VM 在内部使用 int 来表示 short 值,并且 int 可以直接表示全部范围的无符号 16 位值,因此将 char 转换为 short 与将其转换为 int 相比没有任何好处。
  • @JanB 删除了选角,无论如何感谢您在这里分享您的知识。虽然我知道但忘记了,谢谢提醒我。
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2011-01-10
  • 2010-09-12
  • 2014-09-08
  • 2014-10-16
  • 2012-03-06
相关资源
最近更新 更多