C11中的Unicode

摘要:
除此之外,C11标准中还添加了诸如wsprintf、wfprintf、vwprintf、wprintf等宽字符函数。而对于Unicode字符的显示是各家平台自己实现的。");}在NSString字符串格式中,%C对应类型为unichar的UTF16编码字符;%S对应类型为constunichar*,即UTF16编码的字符串。由于OSX以及iOS所用的LLVMClang编译器没有引入C11标准的,因此有些UTF8与UTF16字符串的标准转换函数在这些环境下均无法支持,我们只能通过Foundation库的NSString来解决。下面介绍在标准C11情况下如果操作UTF-8、UTF16字符串,它们之间的相互转换以及打印输出。

在C11(ISO/IEC 9899:2011)标准中引入了对UTF8、UTF16以及UTF32字符编码的支持。

其中,UTF8字符直接通过char来定义,字面量前缀使用u8。比如:

char c = u8'';
const char *s = u8"你好";

而UTF16字符直接通过char16_t来定义,字面量前缀使用u。比如:

#include <uchar.h>
char16_t c = u'';
const char16_t *s = "你好";

而UTF32字符直接通过char32_t来定义,字面量前缀使用U。比如:

#include <uchar.h>
char32_t c = U'';
const char32_t *s = U"你好";

在使用char16_t以及char32_t的时候必须包含头文件<uchar.h>。除此之外,C11标准中还添加了诸如wsprintf、wfprintf、vwprintf、wprintf等宽字符函数。不过这些函数的字符串都是const wchar_t*类型的,即宽字符指针类型。而对于Unicode字符的显示是各家平台自己实现的。在OS X以及iOS中,至今(Apple LLVM 6.0)还没完美地支持这一C11特性,但是UTF8、UTF16以及UTF32字面量都已经支持了,尽管系统本身不支持对UTF32编码格式的解析。另外,也没有包含<uchar.h>头文件。不过,我们可以使用Foundation库自带的unichar类型来代替char16_t。另外,printf函数不支持对UTF16编码字符的打印,若要打印UTF16字符或字符串,只能用Foundation里的NSLog函数。

下面举些例子:

#include <stdio.h>
#include <wchar.h>
- (void)viewDidLoad
{
    [super viewDidLoad];
    //Do any additional setup after loading the view, typically from a nib.
    const char *s = u8"你好,世界!";
    printf("此UTF-8字符串为: %s
", s);
    unichar ch = u'';
    const unichar *us = u"好,世界!";
    NSLog(@"该UTF16是:%C%S", ch, us);
    wprintf(L"iOS does not support for printing wide-character unicodes!
");
}

在NSString字符串格式中,%C对应类型为unichar(实际为unsigned short)的UTF16编码字符;%S对应类型为const unichar*,即UTF16编码的字符串。

由于OS X以及iOS所用的LLVM Clang编译器没有引入C11标准的<uchar.h>,因此有些UTF8与UTF16字符串的标准转换函数在这些环境下均无法支持,我们只能通过Foundation库的NSString来解决。不过,如果在Linux下,我们使用GCC4.8或更高版本的话,那么就能使用标准的C11提供的转换函数了。不过在标准C语言中,printf、puts这类打印函数只支持对UTF-8编码格式的字符串的正确打印,因此我们要输出的话需要把UTF-16编码的字符串转为UTF-8。下面介绍在标准C11情况下如果操作UTF-8、UTF16字符串,它们之间的相互转换以及打印输出。

#include <stdio.h>
#include <uchar.h>
size_t UTF16StrLen(const char16_t *utf16String)
{
    if(utf16String ==NULL)
        return 0;
    size_t index;
    for(index = 0; utf16String[index] != u'

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇BPF及其衍生产物初见旋转矩阵、旋转向量、欧拉角、四元数的关系下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

GBK、GB2312、iso-8859-1之间的区别

转自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK、GB2312、iso-8859-1之间的区别   GB2312,由中华人民共和国政府制定的,简体汉字编码规范,大陆所有计算机中的简体中文,都使用此种编码格式。目前,我也不知道还有另外的简体汉字编码规范。与此对应的还有BIG5,是中华民国...

Oracle定义varchar2()类型存储汉字的长度问题

varchar2最大是4000字节,那么就看你的oracle字符集:(select userenv('language') from dual;)如果字符集是16位编码的,ZHS16GBK,那么每个字符16位,2字节,所以可以容纳2000字符。如果是32位编码的字符集,那么只能存储 1000个字符。 例如:varchar(50) 表示该字段类型为varc...

详解centos下vi的用法

     vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。 1、vi...

JS编码方式

1. escape(): 采用unicode字符集对指定的字符串除0-255以外进行编码。所有的空格符、标点符号、特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z。 2...

Linux 字符集的查看及修改

一·查看字符集 字符集在系统中体现形式是一个环境变量,以CentOS6.5为例,其查看当前终端使用字符集的方式可以有以下几种方式: 第一种: [root@Testa-www tmp]# echo $LANG zh_CN.UTF-8 第二种: [root@Testa-www ~]# env |grep LANG LANG=zh_CN.UTF-8 第三种: [...

一个用于读unicode文本的迭代器(iterator)

written by chenghuige at gmail.com 也需有更好的方法我没有想到,但是没有在linux下面找到比较方便的读取unicode文本的方法。 用ICU,QT都太重量级了,于是自己写了一个包装好的unicode_iterator,当然还可以进一步 包装比如提出一个类提供begin和end.但是还要考虑很多,比如有的是little e...