ASCII码相当于Java中的unicode字符

时间:2013-10-03 05:23:16

标签: 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代码中获得相同的值。

3 个答案:

答案 0 :(得分:1)

尝试将Java字符截断为1个字节

 sum += (0xFF & keyValue.charAt(i)) * 11;

答案 1 :(得分:1)

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

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

如果这也不起作用,

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

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

答案 2 :(得分:0)

Charset.forName("US-ASCII").encode(keyValue).toArray()

为您提供byte[] ASCII代码数组,然后您可以像在C ++中一样操作。