`

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语言字符串转换为Python字符串的方法

    如果C语言字符串是宽字符串,可以使用Py_BuildValue()函数或PyUnicode_FromWideChar()函数来构建一个字符串,例如: ```c wchar_t *w; /* Wide character string */ int len; /* Length */ PyObject *obj = Py_...

    解析unicode的json字符串的cJSON,支持宽字符串

    在解析过程中,还需要处理JSON字符串中的Unicode转义序列,如`\u00e9`,这代表了字符'é'。CJSON原本只处理ASCII转义序列,所以我们需要扩展其内部的转义序列解析逻辑,使其能够识别并正确处理Unicode转义。 对于...

    C语言写的一些字符串处理函数,包括连接,查找重复字符和获取字符串长度

    由于C语言标准库中提供了诸如`strlen`、`strcpy`、`strcat`等基本的字符串操作函数,但有时我们需要实现更特定的功能,例如查找字符串中的重复字符或连接多个字符串。下面我们将深入探讨这些自定义的字符串处理函数...

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

    `wcscspn()`和`wcsstr()`用于计算不包含特定子字符串的字符数量,以及查找子字符串在主字符串中的位置。 总的来说,C语言中的宽位处理函数扩展了标准C库的功能,使得处理非ASCII字符集、多语言环境和本地化需求成为...

    c语言怎么进行字符串比较.docx

    ### C语言中的字符串比较方法详解 #### 一、引言 C语言作为一种广泛使用的编程语言,在处理文本数据时经常需要用到字符串操作。其中,字符串比较是非常基础且重要的功能之一。本文将详细介绍C语言中用于字符串比较...

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

    - **宽字符:** `wcspbrk()` 在宽字符字符串中查找子字符串中任何宽字符的位置。 - **通用:** `_tcspbrk()` 在通用字符串中查找子字符串中任何字符的位置。 - **子字符串搜索:** - **ANSI:** `strstr()` 在字符串...

    C语言常用转义字符表[参考].pdf

    C语言中的转义字符是指在字符常量或字符串中使用的一些特殊字符,以表达一些不可见或不可打印的字符。这些字符在ASC II码表中有着特定的含义,以下是常用的转义字符: * \o 空字符 (NULL) :00H/0 * \n 换行符 (LF)...

    [C语言]字符串处理 - ANSI - Unicode - UTF8 转换

    在编程领域,尤其是在C语言中,处理字符串时经常会遇到字符编码的问题。ANSI、Unicode和UTF-8是三种常见的字符编码格式,它们各有特点并适用于不同的场景。了解这些编码之间的转换对于开发跨平台的软件至关重要。 1...

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

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

    C语言字符编码转换UNICODE、GBK、UTF-8互相转换

    在C语言中,进行字符编码转换通常涉及到内存操作和位操作,因为C语言没有内置的字符串类或者编码转换函数。以下是一些基本步骤: 1. **读取原始编码**:首先,你需要读取源文件或字符串,确定其当前的编码格式。这...

    字符串数据结构实现(数组方式)

    在C++中,可以使用`std::wstring`来处理宽字符,或者使用`std::u16string`和`std::u32string`来处理UTF-16和UTF-32编码的字符串。在Java中,由于其内建的Unicode支持,处理中文字符相对容易,但仍然需要注意字符编码...

    C语言中字符和字符串处理(ANSI字符和Unicode字符)

    在C语言中,字符和字符串处理是编程的基本要素。ANSI字符和Unicode字符是两种不同的字符编码标准,它们用于表示不同范围和类型的字符。 ANSI字符通常指的是ASCII字符集,这是一个7位编码标准,包含了128个不同的...

    Visual C++ 字符串

    2. **访问字符**:使用下标运算符可以访问字符串中的单个字符,如`str[0]`获取第一个字符。注意,下标从0开始。 3. **字符串拼接**:可以使用`+`运算符连接两个字符串,或者使用`append()`函数。 ```cpp std::...

    C_宽字符处理函数函数与普通函数对照表(转).docx

    - `wcspbrk()` 对应 `strpbrk()`: 查找字符串中匹配另一字符串中的任何字符的第一个位置。 - `wcsstr()` 对应 `strstr()`: 在字符串中查找子字符串的第一个出现位置。 - `wcscspn()` 对应 `strcspn()`: 返回不...

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

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

    C语言UTF8到ANSI和Unicode转换代码

    可以先将ANSI字符串转换为宽字符(Unicode)字符串,然后再将其编码为UTF8。 3. **UTF8到Unicode**:这个转换相对简单,因为UTF8本身就是Unicode的一种编码。只需解析UTF8编码,转换成相应的Unicode代码点,然后...

    在C语言中比较两个字符串是否相等的方法

    在C语言中,比较两个字符串是否相等是一个常见的任务,这通常涉及到字符串处理函数的使用。本文将详细讲解两种常用的方法:`strcmp()` 和 `strcasecmp()` 函数。 首先,我们来看 `strcmp()` 函数。这个函数是C语言...

    TCHAR字符串类 TString

    5. **格式化操作**:`Format`函数允许开发者使用类似于C语言的`printf`格式化字符串,将变量值插入到字符串中。 6. **截取与分割**:`Mid`、`Left`、`Right`等方法允许提取字符串的一部分,而`Tokenize`或`Split`...

    用C语言完成普遍地三种中文内码转换.doc

    大五码转 GBK 码函数使用 MultiByteToWideChar 函数将大五码字符串转换为宽字符字符串,然后使用 WideCharToMultiByte 函数将宽字符字符串转换为 GBK 码字符串。 GBK 转大五码函数使用 MultiByteToWideChar 函数将 ...

    【字符串函数】strcpy的使用及原理

    在C语言中,`strcpy`是一个非常基础且重要的字符串处理函数,它用于复制一个字符串到另一个字符串中。本文将深入探讨`strcpy`的使用方法、原理以及相关的注意事项。 `strcpy`函数是C标准库`string.h`中的一部分,其...

Global site tag (gtag.js) - Google Analytics