`

C语言中的宽字符串的使用

阅读更多
copy:http://luckybirdtom.blog.hexun.com/40835185_d.html



通过设置区域可以格式化字符、日期和为货币显示格式为本地。C语言支持这些特性使得C语言可以直接支持中文。C语言中的宽字符与多字节字符的简介可以参考后面的介绍。
unicode宽字符串使用方法如下:包含头文件#include<locale.h>,程序初始处写语句setlocale(LC_ALL, "Chinese"); 声明变量时应该在字符串前加上L wchar_t ws[100] = L"俄罗斯russia"; 一般的字符串处理函数都换成以wcs开头的版本, printf("%d\n", wcslen(ws) ); 则会输出9(“俄罗斯”算三个字符)。如果printf的格式串使用的是宽字符串,则应该使用wprintf。相关的其他一些函数还有有wctomb,wcstombs ,mbstowcs,mbtowc在两种字符串之间转换。
这样就可以直接处理中文字符串了,不会出现将一个中文汉字当成两个字母处理所出现的种种问题。
下面是一段示例代码(在vc60环境下使用)


#include<stdio.h>
#include<string.h>
#include<locale.h>
#include<stdlib.h>
#include<time.h>

int main()
{
    setlocale(LC_ALL, "Chinese");   //设置为中文本地化
    wchar_t s[100]=L"俄罗斯123";    //初始化时在字符串前加L
    char a[100]="中国China";
    mbstowcs(s,a,100);              //多字符字符串转为宽字符串
    printf("%d\n", sizeof(wchar_t));//每个字符占2字节
    printf("%d\n", strlen(a));//str开头是多字节字符串函数 计算长度时一个汉字算2
    printf("%d\n", wcslen(s));//wcs开头是宽字符串函数 一个汉字长度算1
    printf("%S\n", s);//注意使用大写的S

//下面是一段帮助文档中的示例代码 在中文模式下显示当地的时间

    time_t ltime;
    struct tm *thetime;
    unsigned char str[100];

    time (&ltime);
    thetime = gmtime(&ltime);

    /* %#x is the long date representation, appropriate to
     * the current locale    */

    //setlocale(LC_ALL, "Chinese");
    if (!strftime((char *)str, 100, "%#x",(const struct tm *)thetime))
        printf("strftime failed!\n");
    else
        printf("In Chinese locale, strftime returns '%s'\n", str);

    /* Set the locale back to the default environment */
    setlocale(LC_ALL, "C");
    time (&ltime);
    thetime = gmtime(&ltime);

    if (!strftime((char *)str, 100, "%#x", (const struct tm *)thetime))
        printf("strftime failed!\n");
    else
        printf("In 'C' locale, strftime returns '%s'\n", str);

    return 0;
}


wide character (http://en.wikipedia.org/wiki/Wide_character)
Wide character is a computer programming term. It is a vague term used to represent a datatype that is richer than the traditional (8-bit) characters. It is not the same thing as Unicode.

wchar_t is a data type in ANSI/ISO C and some other programming languages that is intended to represent wide characters.
The Unicode standard 4.0 says that
"ANSI/ISO C leaves the semantics of the wide character set to the specific implementation but requires that the characters from the portable C execution set correspond to their wide character equivalents by zero extension."
and that
"The width of wchar_t is compiler-specific and can be as small as 8 bits. Consequently, programs that need to be portable across any C or C++ compiler should not use wchar_t for storing Unicode text. The wchar_t type is intended for storing compiler-defined wide characters, which may be Unicode characters in some compilers."
Under Win32, wchar_t is 16 bits wide and represents a UTF-16 code unit. On Unix-like systems wchar_t is commonly 32 bits wide and represents a UTF-32 code unit.
In ANSI C library header files, <wchar.h> and <wctype.h> deal with the wide characters.
什么是C语言中的宽字符与多字节字符

来源:www.dzsc.com/data/html/2008-9-12/69107.html

  C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位。但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码。

  C95标准化了两种表示大型字符集的方法:宽字符(wide character,该字符集内每个字符使用相同的位长)以及多字节字符(multibyte character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流(stream)所在的环境背景决定)。

  自从1994年的增补之后,C语言不只提供char类型,还提供wchar_t类型(宽字符),此类型定义在stddef.h 头文件中。wchar_t指定的宽字节类型足以表示某个实现版本扩展字符集的任何元素。

  在多字节字符集中,每个字符的编码宽度都不等,可以是一个字节,也可以是多个字节。源代码字符集和运行字符集都可能包含多字节字符。多字节字符可以被用于字符的常量、字符串字面值(string literal)、标识符(identifier)、注释(comment),以及头文件。

  C语言本身并没有定义或指定任何编码集合,或任何字符集(基本源代码字符集和基本运行字符集除外),而是由其实现指定如何编码宽字符,以及要支持什么类型的多字节字符编码机制。

  虽然C标准没有支持Unicode字符集,但是许多实现版本使用Unicode转换格式UTF-16和UTF-32来处理宽字符。如果遵循Unicode标准,wchar_t类型至少是16或32位长,而wchar_t类型的一个值就代表一个Unicode字符。

  UTF-8是一个由Unicode Consortium(万国码联盟)定义的实现,可以表示Unicode字符集的所有字符。UTF-8字符所使用的空间大小从一个字节到四个字节都有可能。

  多字节字符和宽字符(也就是wchar_t)的主要差异在于宽字符占用的字节数目都一样,而多字节字符的字节数目不等,这样的表示方式使得多字节字符串比宽字符串更难处理。比方说,即使字符'A'可以用一个字节来表示,但是要在多字节的字符串中找到此字符,就不能使用简单的字节比对,因为即使在某个位置找到相符合的字节,此字节也不见得是一个字符,它可能是另一个不同字符的一部分。然而,多字节字符相当适合用来将文字存储成文件。

  C提供了一些标准函数,可以将多字节字符转换为wchar_t,或将宽字符转换为多字节字符。比方说,如果C 编译器使用Unicode 标准的UTF-16 和UTF-8,那么下面调用wctomb()函数就可以获得字符的多字节表示方式(注:wctomb = wide character to multibyte)。

分享到:
评论

相关推荐

    C语言字符串和宽位处理函数

    C语言字符串和宽位处理函数

    什么是C语言中的宽字符与多字节字符

     C95标准化了两种表示大型字符集的方法:宽字符(wide character,该字符集内每个字符使用相同的位长)以及多字节字符(multibyte character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流...

    VC++字符串处理函数对照表(宽字符与ANSI字符)

    本文档列出了标准C语言ANSI字符与C++宽字符的处理函数对照表,对于处理宽字符是很好的参考文件。

    (宽)字符串与变量类型相互转化

    (宽)字符串与变量类型相互转化 各种变量之间的相互转换。 开发必知

    EDA/PLD中的什么是C语言中的宽字符与多字节字符

     C95标准化了两种表示大型字符集的方法:宽字符(wide character,该字符集内每个字符使用相同的位长)以及多字节字符(multibyte character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流...

    C语言入门经典(第4版)--源代码及课后练习答案

    6.7 使用宽字符串 225 6.8 设计一个程序 228 6.8.1 问题 229 6.8.2 分析 229 6.8.3 解决方案 229 6.9 小结 237 6.10 习题 237 第7章 指针 239 7.1 指针初探 239 7.1.1 声明指针 240 7.1.2 通过指针访问值 ...

    c语言库函数使用大全及头文件介绍

    #include &lt;string.h&gt; //字符串处理 #include &lt;strstrea.h&gt; //基于数组的输入/输出 #include &lt;time.h&gt; //定义关于时间的函数 #include &lt;wchar.h&gt; //宽字符处理及输入/输出 #include &lt;wctype.h&gt; //宽字符分类 ...

    C语言PUD编码

    虽然使用的是VC 6.0编写的程序,但是已经测试过,在底层c中也可以实现PDU编码。短信猫中经常用到,主要是一个宽字符串的转换。

    西工大noj答案完整版.doc

    西北工业大学NOJC程序设计习题答案(非本人制作,侵删) 1.“1“的传奇 ...141.字符串左中右 142.组合数 143.最次方数 144.最大乘积 145.最大整数 146.最小整数 147.最长回文子串 148.左上角 149.左下角

    C语言深度解剖(完美版).pdf

    1.1,最宽恒大量的关键字----auto..........................................................................................11 1.2,最快的关键字---- register.................................................

    入门学习Linux常用必会60个命令实例详解doc/txt

    umount命令的作用是卸载一个文件系统,它的使用权限是超级用户或/etc/fstab中允许的使用者。 2.格式 unmount -a [-fFnrsvw] [-t vfstype] [-n] [-rw] [-F] device dir 3.使用说明 umount 命令是mount命令...

    C++大学教程,一本适合初学者的入门教材(part2)

    19.10 转换成C语言式char 字符串 19.11 迭代器 19.12 字符串流处理 小结 术语 自测练习 自测练习答案 练习 第20章 标准模板库(STL) 20.1 标准模板库(STL)简介 20.1.1 容器简介 20.1.2 迭代器简介 20.1.3 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    19.10 转换成C语言式char 字符串 19.11 迭代器 19.12 字符串流处理 小结 术语 自测练习 自测练习答案 练习 第20章 标准模板库(STL) 20.1 标准模板库(STL)简介 20.1.1 容器简介 20.1.2 迭代器简介 20.1.3 ...

    PCtoLCD2002,字模提取工具

    1.生成中英文数字混合的字符串的字模数据. 2.可选择字体,大小,并且可独立调整文字的长和宽,生成任意形状的字符。 3.各种旋转,翻转文字功能 4.任意调整输出点阵大小,并任意调整字符在点阵中的位置。 5.字模...

    printf__左补零

    如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。 但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入...

    图片取模软件PCtoLCD2002

    支持四种取模方式:逐行、逐列、行列、列行,可以生成中英文数字混合的字符串的字模数据,可选择字体,大小,并且可独立调整文字的长和宽,生成任意形状的字符。除了选择系统预设的C语言和汇编语言两种格式,还可以...

    Unicode文件读取

    从文本文件(unicode文本)中读取字符串,并转化为CString(char) 演示mbstowcs 和 WideCharToMultiByte的使用

    用于液晶字符码转换的工具

    生成中英文数字混合的字符串的字模数据. 2.可选择字体,大小,并且可独立调整文字的长和宽,生成任意形状的字符。 3.各种旋转,翻转文字功能 4.任意调整输出点阵大小,并任意调整字符在点阵中的位置。 5.字模...

    PCtoLCD2002完美版(字符提取软件).rar

    生成中英文数字混合的字符串的字模数据. 2.可选择字体,大小,并且可独立调整文字的长和宽,生成任意形状的字符。 3.各种旋转,翻转文字功能 4.任意调整输出点阵大小,并任意调整字符在点阵中的位置。 5.字模...

Global site tag (gtag.js) - Google Analytics