宽字符和多字节字符
目录

C 语言的i18n支持:

  • 宽字符 wchar_t: 每个字符占用的字节数一样,一般为16位(UCS-2, VC7.0)或32位(UCS-4, GNU Libc)
  • 多字节字符(MBCS): 每个字符占用的字节数不等,如UTF-8

对于每个宽字符,都存在对应的多字节字符,反之亦然;

宽字符

unicode编码一般以wchar_t类型存储。UNICODE字符称为宽字符。

宽字符字符串表示为一个 wchar_t[] 数组并由 wchar_t* 指针指向它。 可以通过用字母 L 作为字符的前缀将任何 ASCII 字符表示为宽字符形式。

#include<locale.h>
...
setlocale(LC_ALL, "Chinese");
wchar_t ws[100] = L"俄罗斯russia";           // 声明变量时应该在字符串前加上L
printf("%d\n", wcslen(ws) );                 // 一般的字符串处理函数都换成以wcs开头的版本,
wprintf(L"%ls \n", L"A wide string");        // 如果printf的格式串使用的是宽字符串,则应该使用wprintf

多字节字符

UNICODE的实现方式不同于编码方式。 UTF-8是UNICODE的一种实现方式,并且节省了空间,兼容了ASCII。

多字节字符集 (MBCS) 是一种替代 Unicode 以支持无法用单字节表示的字符集(如日文和中文)的方法。

宽字符和多字节字符之间的转换

wctomb,wcstombs ,mbstowcs,mbtowc在两种字符串之间转换。

#include <stdlib.h>
int wctomb(char *s, wchar_t wc);                              // convert a wide character to a multibyte sequence
int mbtowc(wchar_t *pwc, const char *s, size_t n);            // convert a multibyte sequence to a wide character
size_t wcstombs(char *dest, const wchar_t *src, size_t n);    // convert a wide-character string to a multibyte string
size_t mbstowcs(wchar_t *dest, const char *src, size_t n);    // convert a multibyte string to a wide-character string

参考

发表评论