- 浏览: 460759 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (538)
- C/C++ Primer (69)
- Objective-C Primer (102)
- Python Primer (19)
- JavaScript Primer (1)
- Java Primer (37)
- PHP Primer (17)
- 泛 Linux (37)
- Shell Script (21)
- APUE (21)
- UNP__1&2 (19)
- NetWork (7)
- Oracle周边 (38)
- Mysql里边 (6)
- Windows技 (9)
- 简单算法 & 数据结构 (14)
- 设计模式 (6)
- GTK历程 (12)
- 工具使用 (25)
- 杂事 (23)
- 一些概念 (17)
- Web方面 (10)
- myCodeTools (9)
- ^未 竟$ (13)
- 硬件通信 (2)
- Games (1)
最新评论
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环境下使用)
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语言中的宽字符与多字节字符的简介可以参考后面的介绍。
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 (<ime); thetime = gmtime(<ime); /* %#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 (<ime); thetime = gmtime(<ime); 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)。
发表评论
-
float equal
2013-05-23 18:21 822- (BOOL)floatA:(float)f1 equalB ... -
C++序列化
2012-07-12 09:51 596http://hi.baidu.com/ewook/item/ ... -
C++著名内裤
2011-12-02 14:00 8131、C++各大有名库的介绍 ... -
C++写C
2011-09-06 17:23 655在C++中写C,标准头文件写法 #ifndef __AB ... -
errno.h
2011-05-05 14:27 697#define EPERM 1 ... -
__cplusplus
2011-04-21 15:09 739http://www.cnblogs.com/stonecra ... -
Pthread__常用
2011-04-21 11:46 853http://blogold.chinaunix.net/u/ ... -
常用预编译
2011-04-21 10:32 658#if defined(WIN32) || defined ... -
C++__容器
2011-04-18 10:16 559http://apps.hi.baidu.com/share/ ... -
C++模板
2011-03-29 14:27 626内容主要来至《钱能C++程序设计教程》&《C++ Pr ... -
交叉引用、前置声明
2011-03-02 09:40 805有两个类相互引用了,编译器报错。 原因是两个类交叉引用: A ... -
typedef的四个用途和两个陷阱
2010-12-14 12:34 656http://hi.baidu.com/changfeng01 ... -
第五届开源小组招新题目
2010-12-03 21:56 751这是学校的开源小组招新题。 08年时我是第二届的组长,不知不觉 ... -
string const char*
2010-12-02 16:13 778http://topic.csdn.net/u/2008092 ... -
CPP Container
2010-11-10 09:20 732延后整理。。。 -
C语言运算符优先级
2010-11-02 17:45 791优先级 运算符 ... -
point point
2010-11-02 17:23 624http://learn.akae.cn/media/ch23 ... -
位运算
2010-11-01 11:33 783千百年来,位运算始终没出现在我写的代码里,今天终于出现了。 ... -
Unix环境下操作特大文件
2010-11-01 11:03 619http://hi.baidu.com/jiangfeng11 ... -
GCC在C语言中内嵌汇编
2010-10-22 14:48 1369http://hi.baidu.com/liu_bin0101 ...
相关推荐
如果C语言字符串是宽字符串,可以使用Py_BuildValue()函数或PyUnicode_FromWideChar()函数来构建一个字符串,例如: ```c wchar_t *w; /* Wide character string */ int len; /* Length */ PyObject *obj = Py_...
在解析过程中,还需要处理JSON字符串中的Unicode转义序列,如`\u00e9`,这代表了字符'é'。CJSON原本只处理ASCII转义序列,所以我们需要扩展其内部的转义序列解析逻辑,使其能够识别并正确处理Unicode转义。 对于...
由于C语言标准库中提供了诸如`strlen`、`strcpy`、`strcat`等基本的字符串操作函数,但有时我们需要实现更特定的功能,例如查找字符串中的重复字符或连接多个字符串。下面我们将深入探讨这些自定义的字符串处理函数...
`wcscspn()`和`wcsstr()`用于计算不包含特定子字符串的字符数量,以及查找子字符串在主字符串中的位置。 总的来说,C语言中的宽位处理函数扩展了标准C库的功能,使得处理非ASCII字符集、多语言环境和本地化需求成为...
### C语言中的字符串比较方法详解 #### 一、引言 C语言作为一种广泛使用的编程语言,在处理文本数据时经常需要用到字符串操作。其中,字符串比较是非常基础且重要的功能之一。本文将详细介绍C语言中用于字符串比较...
- **宽字符:** `wcspbrk()` 在宽字符字符串中查找子字符串中任何宽字符的位置。 - **通用:** `_tcspbrk()` 在通用字符串中查找子字符串中任何字符的位置。 - **子字符串搜索:** - **ANSI:** `strstr()` 在字符串...
C语言中的转义字符是指在字符常量或字符串中使用的一些特殊字符,以表达一些不可见或不可打印的字符。这些字符在ASC II码表中有着特定的含义,以下是常用的转义字符: * \o 空字符 (NULL) :00H/0 * \n 换行符 (LF)...
在编程领域,尤其是在C语言中,处理字符串时经常会遇到字符编码的问题。ANSI、Unicode和UTF-8是三种常见的字符编码格式,它们各有特点并适用于不同的场景。了解这些编码之间的转换对于开发跨平台的软件至关重要。 1...
C95标准化了两种表示大型字符集的方法:宽字符(wide character,该字符集内每个字符使用相同的位长)以及多字节字符(multibyte character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流...
在C语言中,进行字符编码转换通常涉及到内存操作和位操作,因为C语言没有内置的字符串类或者编码转换函数。以下是一些基本步骤: 1. **读取原始编码**:首先,你需要读取源文件或字符串,确定其当前的编码格式。这...
在C++中,可以使用`std::wstring`来处理宽字符,或者使用`std::u16string`和`std::u32string`来处理UTF-16和UTF-32编码的字符串。在Java中,由于其内建的Unicode支持,处理中文字符相对容易,但仍然需要注意字符编码...
在C语言中,字符和字符串处理是编程的基本要素。ANSI字符和Unicode字符是两种不同的字符编码标准,它们用于表示不同范围和类型的字符。 ANSI字符通常指的是ASCII字符集,这是一个7位编码标准,包含了128个不同的...
2. **访问字符**:使用下标运算符可以访问字符串中的单个字符,如`str[0]`获取第一个字符。注意,下标从0开始。 3. **字符串拼接**:可以使用`+`运算符连接两个字符串,或者使用`append()`函数。 ```cpp std::...
- `wcspbrk()` 对应 `strpbrk()`: 查找字符串中匹配另一字符串中的任何字符的第一个位置。 - `wcsstr()` 对应 `strstr()`: 在字符串中查找子字符串的第一个出现位置。 - `wcscspn()` 对应 `strcspn()`: 返回不...
(宽)字符串与变量类型相互转化 各种变量之间的相互转换。 开发必知
可以先将ANSI字符串转换为宽字符(Unicode)字符串,然后再将其编码为UTF8。 3. **UTF8到Unicode**:这个转换相对简单,因为UTF8本身就是Unicode的一种编码。只需解析UTF8编码,转换成相应的Unicode代码点,然后...
在C语言中,比较两个字符串是否相等是一个常见的任务,这通常涉及到字符串处理函数的使用。本文将详细讲解两种常用的方法:`strcmp()` 和 `strcasecmp()` 函数。 首先,我们来看 `strcmp()` 函数。这个函数是C语言...
5. **格式化操作**:`Format`函数允许开发者使用类似于C语言的`printf`格式化字符串,将变量值插入到字符串中。 6. **截取与分割**:`Mid`、`Left`、`Right`等方法允许提取字符串的一部分,而`Tokenize`或`Split`...
大五码转 GBK 码函数使用 MultiByteToWideChar 函数将大五码字符串转换为宽字符字符串,然后使用 WideCharToMultiByte 函数将宽字符字符串转换为 GBK 码字符串。 GBK 转大五码函数使用 MultiByteToWideChar 函数将 ...
在C语言中,`strcpy`是一个非常基础且重要的字符串处理函数,它用于复制一个字符串到另一个字符串中。本文将深入探讨`strcpy`的使用方法、原理以及相关的注意事项。 `strcpy`函数是C标准库`string.h`中的一部分,其...