我知道这个问题可能非常基础。如果这是显而易见的,请原谅我。 考虑以下程序:
#include <stdio.h>
int main(void) {
// this is a string in English
char * str_1 = "This is a string.";
// this is a string in Russian
char * str_2 = "Это строковая константа.";
// iterator
int i;
// print English string as a string
printf("%s\n", str_1);
// print English string byte by byte
for(i = 0; str_1[i] != '\0'; i++) {
printf(" %c ",(char) str_1[i]);
}
printf("\n");
// print numerical values of English string byte by byte
for(i = 0; str_1[i] != '\0'; i++) {
printf("%03d ",(int) str_1[i]);
}
printf("\n");
// print Russian string as a string
printf("%s\n", str_2);
// print Russian string byte by byte
for(i = 0; str_2[i] != '\0'; i++) {
printf(" %c ",(char) str_2[i]);
}
printf("\n");
// print numerical values of Russian string byte by byte
for(i = 0; str_2[i] != '\0'; i++) {
printf("%03d ",(int) str_2[i]);
}
printf("\n");
return(0);
}
输出:
This is a string.
T h i s i s a s t r i n g .
084 104 105 115 032 105 115 032 097 032 115 116 114 105 110 103 046
Это строковая константа.
▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ .
-48 -83 -47 -126 -48 -66 032 -47 -127 -47 -126 -47 -128 -48 -66 -48 -70 -48 -66 -48 -78 -48 -80 -47 -113 032 -48 -70 -48 -66 -48 -67 -47 -127 -47 -126 -48 -80 -48 -67 -47 -126 -48 -80 046
可以看到,英文(ASCII)字符串可以作为字符串打印或使用数组索引访问并逐个字符(逐字节)打印,但俄语字符串(我认为是以UTF-8编码)可以作为字符串打印,但无法逐个字符访问。
我理解的原因是,在这种情况下,俄语字符使用两个字节而不是一个字节进行编码。
我的问题是是否有任何简单的方法可以使用标准C库函数按字符逐个打印Unicode字符串(在这种情况下是每次两个字节),通过正确声明数据类型或通过标记字符串或通过设置区域设置或以其他方式实现。
我尝试在俄语字符串之前加上“u8”,即
char * str_2 = u8“…”
,但这不会改变行为。我想避免使用广泛使用的字符,例如每个字符恰好两个字节。任何建议将不胜感激。