C语言学习:宽字符串与窄字符串的转换

什么也不设置, 看一下代码运行结果。

 1 #include <io_utils.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <wchar.h>
 5 #include <wctype.h>
 6 #include <locale.h>
 7 
 8 int main() {
 9   // support for wide string
10   {
11     PRINT_BOOL(iswalpha(L'A'));
12     PRINT_BOOL(iswdigit(L'2'));
13 
14     wchar_t *wcs = L"你好 Hello";
15     size_t length = wcslen(wcs);
16     PRINT_INT(length);
17 
18     wchar_t src[] = L"HelloWorld";
19     wchar_t *dest = malloc(sizeof(wchar_t) * 11);
20     wmemset(dest, 0, 11);
21     wmemcpy(dest, src, 11);
22     _putws(dest);
23     wmemcpy(dest + 3, dest + 1, 4);
24     _putws(dest);
25     free(dest);
26   }
27 
28   // conversions
29 //  char *new_locale = setlocale(LC_ALL, "zh_CN.utf8");
30 //  if (new_locale) {
31 //    puts(new_locale);
32 //  }
33 
34   {
35     char mbs[] = "你好";
36     wchar_t wcs[10];
37     mbstowcs(wcs, mbs, 10);
38     wprintf(L"%s\n", wcs);
39     printf("%s\n","dafdasfddsaf");
40   }
41   return 0;
42 }
View Code

可以看到字符串长度是9, 但其实是8, 中文乱码了。  我们的文件编码是utf-8。

 

 设置cmake的编码(可以参考最后一张图片的代码来设置编码),发现字符串的长度现在是对了, 但是中文还是乱码。

设置locale,代码如下

 1 #include <io_utils.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <wchar.h>
 5 #include <wctype.h>
 6 #include <locale.h>
 7 
 8 int main() {
 9   // support for wide string
10   {
11     PRINT_BOOL(iswalpha(L'A'));
12     PRINT_BOOL(iswdigit(L'2'));
13 
14     wchar_t *wcs = L"你好 Hello";
15     size_t length = wcslen(wcs);
16     PRINT_INT(length);
17 
18     wchar_t src[] = L"HelloWorld";
19     wchar_t *dest = malloc(sizeof(wchar_t) * 11);
20     wmemset(dest, 0, 11);
21     wmemcpy(dest, src, 11);
22     _putws(dest);
23     wmemcpy(dest + 3, dest + 1, 4);
24     _putws(dest);
25     free(dest);
26   }
27 
28   // conversions
29   char *new_locale = setlocale(LC_ALL, "zh_CN.utf8");
30   if (new_locale) {
31     puts(new_locale);
32   }
33 
34   {
35     char mbs[] = "你好";
36     wchar_t wcs[10];
37     mbstowcs(wcs, mbs, 10);
38     wprintf(L"%s\n", wcs);
39     printf("%s\n","dafdasfddsaf");
40   }
41   return 0;
42 }
View Code

结果,完全正确 了。

 

 

 

 

设置CMAKE的编码参数

-DCMAKE_C_FLAGS="UTF-8"

 

 

或者在CMakeLists.txt 文件中设置。

 

posted @ 2023-02-12 12:31  泥古拉斯赵四  阅读(160)  评论(0编辑  收藏  举报