java - Java中unicode字符的ASCII码等价物

标签 java c++ unicode localization ascii

我们在将以下逻辑从 C++ 移植到 Java 时遇到了问题。 Java 方法应返回与 C++ 函数相同的值。如果 keyValue 包含非 ASCII 字符,则逻辑失败。

C++函数如下,

   int CMyClass::KeyToId( const char *keyValue ) {

    int sum = 0, len = strlen( keyValue );

       // Get a sum based on the characters in the string.
       // Each character contributes + <ASCII-value> * 11.
       for( int i = 0; i < len; i++ )   sum += keyValue[i] * 11;
       // Modulo the result to get a value in the standard range.
       return sum;  
   }

在第 2 行中,keyValue[i] 被转换为 8 字节的 ascii 码。

Java 的确切端口如下所示:

private int keyToId(String keyValue) {
     int sum = 0, len =  keyValue.length();

        // Get a sum based on the characters in the string.
        // Each character contributes + <ASCII-value> * 11.

        for( int i = 0; i < len; i++ )   
            sum += keyValue.charAt(i) * 11;
    return sum;
}

在 Java 中,字符 keyValue.charAt(i) 被转换为“unicode”值。我想不出一种简单的方法将其转换为等效的 ASCII 代码。 C++ 应用程序是非 unicode 应用程序。请假设,我们无法更改 C++ 逻辑。

更多输入: 我正在用俄语运行应用程序。对于 красный 的输入,C++ 应用程序返回 -1452。我想从 Java 代码中获得相同的值。

最佳答案

C++ 程序使用平台的默认编码来表示 char 数据类型中的字符。要在 Java 中执行相同操作,您必须使用 Java 的等效 byte 数据类型,并在计算之前转换字符串:

byte[] bytes = keyValue.getBytes();
for (byte b: bytes) sum += 11*b;

如果还是不行,

  • 检查C++程序中char的符号:大多数编译器默认使用signed chars,这与Java的byte不谋而合。如果您使用无符号字符,则代码需要调整。
  • 首先检查 Java 程序是否正确读取字符串。一种方法是打印字节;给定 красный 你应该得到 [-22, -16, -32, -15, -19, -5, -23]:

    System.out.println(java.util.Arrays.toString(bytes));
    

关于java - Java中unicode字符的ASCII码等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19151383/

相关文章:

java - 从 json 字符串 jackson 库 java 中删除斜杠

c++ - SIGRTMAX 的 Valgrind 和 sigaction

c++ - static_assert 向上转换是否需要调整指针

unicode - 为什么大写字母不足以进行不区分大小写的比较?

java - 如果从 Java 控制台读取正则表达式字符,为什么不需要转义?

java - 使用JAVA API从Elastic Search建议搜索响应中提取源数据

python - 统一码编码错误 : 'latin-1' codec can't encode character u'\u03c7' in position 66: ordinal not in range(256)

c++ - 如何在 C++ 中从十六进制字符串输出 Unicode 字符?

java - 服务器上使用 RPC 的多人纸牌游戏

c++ - 苹果操作系统 : using detachNewThreadSelector method inside a C++ class method