中文转Unicode编码

1、实现中文转Unicode

并将转换的16进制存进数组中

#include 
#include 
#include
#include 
#include 
constexpr auto LEN = 2048;   //vs中编译,更换编译环境需要修改 #define  LEN  2048
int main()
{
    char sendbuf[LEN];
    wchar_t str[] = L"中国汉字";
    int i,k = 0;
    int move_bit = 0;  
    setlocale(LC_ALL, "zh_CN.utf8");
    char* buf = (char*)malloc(MB_CUR_MAX);
    for (i = 0; i < wcslen(str); i++)
    wprintf(L"%lx", str[i]);
    printf("\n");
     short * p =(short*) str;
     for (i = 0; i < wcslen(str); i++)
     {
         printf("%x ", p[i]); 
         int four_bit = p[i] >> 12;
         int three_bit = (p[i] & 0x0fff) >> 8;
         int two_bit = (p[i] & 0x00ff) >> 4;
         int one_bit = p[i] & 0xf;
         if (four_bit > 9)
             sendbuf[k++] = four_bit + 55;
         else
             sendbuf[k++] = four_bit + 48;
         if (three_bit > 9)
             sendbuf[k++] = three_bit + 55;
         else
             sendbuf[k++] = three_bit + 48;
         if (two_bit > 9)
             sendbuf[k++] = two_bit + 55;
         else
             sendbuf[k++] = two_bit + 48;
         if (one_bit > 9)
             sendbuf[k++] = one_bit + 55;
         else
             sendbuf[k++] = one_bit + 48;
     }
    
    printf("\n");
    printf("%s \n", sendbuf);
}

2、setlocale函数

setlocale函数:
原型:char* setlocale (int category, const char* locale);
setlocale() 函数既可以用来对当前程序进行地域设置(本地设置、区域设置),也可以用来获取当前程序的地域设置信息,使用setlocale需要两个参数
category:用来设置地域设置的影响范围。地域设置包含日期格式、数字格式、货币格式、字符处理、字符比较等多个方面的内容,当前的地域设置可以只影响某一方面的内容,也可以影响所有的内容,
category 的值不能随便设置,必须使用 中定义的宏
通常有下面这些预定义常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、LC_TIME,其中 LC_ALL 表示所有其它locale分类的并集。
locale:用来设置地域设置的名称(字符串),也就是设置为哪种地域,对于不同的平台和不同的编译器,地域设置的名称可能会不同,C语言标准没有干预太多。
setlocale函数的返回值:
如果 setlocale() 执行成功,那么返回一个指向字符串的指针,该字符串包含了当前地域设置的名称。也就是说,setlocale() 会将当前地域设置的名称返回
如果 setlocale() 执行失败(例如为 locale 指定的名称不存在,就会导致地域设置失败),那么返回空指针NULL

当向终端、控制台输出 wchar_t 类型的字符时,需要设置 setlocale(),因为通常终端、控制台环境自身是不支持 UCS 系列的字符集编码的,当我们使用流操作函数时(如:printf()/fopen_s等),在标准/RT库实现的内部会将 UCS 字符转换成合适的本地 ANSI 编码字符,转换的依据就是 setlocale() 设定的活动 locale,最后将结果字符序列传递给终端,对于来自终端的输入流这个过程刚好相反。所以,当我们使用流操作函数之前,往往需要使用setlocale函数实现字符集编码转换。
可以用重定向输出流到文件的方法验证上面的机制:无论是 Windows CRT、Linux glibc、Cygwin glibc,使用 wprintf() 打印 wchar_t 字符文本时,重定向到文件的内容总是 GBK、UTF-8 等本地 ANSI 编码,而不会是 UCS 编码。

使用 Linux 和 Cygwin 的 glibc 时,要在终端显示正确的中文,需满足以下条件:
不要混用 char 和 wchar_t 版本的流操作函数,否则会导致这些函数运行异常,我用Cygwin GCC 4测试混用 printf() 和 wprintf() 时,程序甚至崩掉,所以要将上面程序中 printf() 语句全注释掉才行。Window CRT 的实现则没有这个问题

运行环境的 locale 设置要和程序中 setlocale() 设定的 locale 一致,比如:终端的活动字符集、环境变量(一般用 LANG),要设置为 *.UTF-8,才能显示 setlocale(LC_ALL, “zh_CN.UTF-8”) 设定的 wchar_t 的中文字符。

用 wprintf() 时,要用 %ls 表示 wchar_t 的字符串,用 %s 表示 char 的字符串,具体参考:man 3 wprintf,而 Windows 的实现用 %ls、%s 都可以正确输出 wchar_t 字符串。

wchar_t,宽字符,是C/C++的字符类型,是一种扩展的存储方式。
wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。

char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。
wchar_t数据类型一般为16位或32位,所能表示的字符数远超char型。

比如对于汉字,韩文以及日文这样的字符,它们的每一个文字都占据两个字节,所以C++提出了wchar_t类型,也称为双字节类型,或宽字符类型。

你可能感兴趣的:(嵌入式,linux)