将 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[]
我正在用 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.
如果字符串是其他编码,则需要使用其他库来执行转换,例如ICU。事实上,C 并没有指定默认编码为“ANSI”(即 Windows 代码页 1252),并且确实没有理由以该旧格式存储新数据。
请注意,int
通常是 32 位宽,但也可以是其他大小,而 Java Char
是 16 位宽。您可能想要传递一种格式,例如 <stdint.h>
中的 uint16_t[]
,这是完全正确的大小,或者 <uchar.h>
.
char16_t[]