首页 > 其他 > 详细

C11中的Unicode

时间:2014-09-22 02:40:43      阅读:444      评论:0      收藏:0      [点我收藏+]

在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\n", 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!\n");
}


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

 

C11中的Unicode

原文:http://www.cnblogs.com/zenny-chen/p/3985324.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!