将 C++ 中的 char 值转换为与 Java 中具有相同值的字符串

Convert char values in C++ to String WITH THE SAME VALUE as in Java

我正在用 C++ 重写一个程序,看看是否可以提高速度,我需要将 char[] 转换为 int[],其字符值与 Java 中一样,您可以看,我把这段代码写在 Java:

public static void main(String[] args) {
    System.out.println("Insert text:");
    Scanner D = new Scanner(System.in);
    String text = D.nextLine();
    int[] textInt = StringToIntArray(text);
    printArray(textInt);
}

public static int charNum(char x){
    int a = x;
    return a;
}

public static int[] StringToIntArray(String text){
    int[] result = new int[text.length()];
    for (int i = 0; i < result.length; i++) {
        result[i] = charNum(text.charAt(i));
    }
    return result;
}

public static void printArray(int[] x){
    for(int i : x){
        System.out.print("["+i+"] ");
    }
    System.out.println("");
}

(如果你输入你好它会打印[72] [101] [108] [108] [111])

但我刚刚注意到在 C++ 中默认的字符格式是 ANSI,有人告诉我 Java 使用 UTF-16。我只需要将文本从 char[] 或 std::string 转换为 int[] 但我确实需要相同的值

(If you input Hello it will print [72] [101] [108] [108] [111])

如果我没理解错的话,您只是想将一个字符串分解为每个字符的整数值。

如果是这样,那么将字符串转换为整数就相当简单了:

std::string s = "Hello";

std::cout << s << ": ";

for( auto ch : s ) {

    int i = static_cast<int>(ch);

    std::cout << "[" << i << "] ";
}

std::cout << std::endl;

由此我得到:

Hello: [72] [101] [108] [108] [111]

这里是 UTF-16 大小写的修改版本:

std::u16string s = u"Hello";

for( auto ch : s ) {

    int i = static_cast<int>(ch);

    std::cout << "[" << i << "] ";
}

std::cout << std::endl;

如果你的字符是ASCII,你可以使用Daniel Day的回答中的方法。

如果它们是 UTF-8 格式或其他本地多字节字符串编码(如果您使用的是一些不同的旧编译器),您可以使用 [=11] 转换为 char16_t[] =]函数从 <uchar.h>,然后从 char16_t[]uint16_t[]int[]。确保字节顺序相同。我强烈建议您尽可能使用 UTF-8 编码。事实上,您可能会发现传递 UTF-8 字符串并从 Java.

中的 UTF-8 转换更简单

如果字符串是其他编码,则需要使用其他库来执行转换,例如ICU。事实上,C 并没有指定默认编码为“ANSI”(即 Windows 代码页 1252),并且确实没有理由以该旧格式存储新数据。

请注意,int 通常是 32 位宽,但也可以是其他大小,而 Java Char 是 16 位宽。您可能想要传递一种格式,例如 <stdint.h> 中的 uint16_t[],这是完全正确的大小,或者 <uchar.h>.

中的 char16_t[]