在C11(ISO/IEC 9899:2011)标准中引入了对UTF8、UTF16以及UTF32字符编码的支持。
其中,UTF8字符直接通过char来定义,字面量前缀使用u8。比如:
char c = u8'你';
const char *s = u8"你好";
而UTF16字符直接通过char16_t来定义,字面量前缀使用u。比如:
#include
char16_t c = u'你';
const char16_t *s = "你好";
而UTF32字符直接通过char32_t来定义,字面量前缀使用U。比如:
#include
char32_t c = U'你';
const char32_t *s = U"你好";
在使用char16_t以及char32_t的时候必须包含头文件
下面举些例子:
#include
#include
- (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编码的字符串。
由于OS X以及iOS所用的LLVM Clang编译器没有引入C11标准的
?
#include
#include
size_t UTF16StrLen(const char16_t *utf16String)
{
? ? if(utf16String == NULL)
? ? ? ? return 0;
? ? size_t index;
? ? for(index = 0; utf16String[index] != u'\0'; index++);
? ? return index;
}
size_t UTF16ToUTF8(char *mbBuffer, const char16_t *utf16String)
{
? ? if(mbBuffer == NULL || utf16String == NULL)
? ? ? ? return 0;
? ? ? ?
? ? mbstate_t state = { };
? ? ? ?
? ? size_t mbIndex = 0;
? ? for(int utf16Index = 0; utf16String[utf16Index] != u'\0'; utf16Index++)
? ? {
? ? ? ? const size_t length = c16rtomb(&mbBuffer[mbIndex], utf16String[utf16Index], &state);
? ? ? ? mbIndex += length;
? ? }
? ?
? ? mbBuffer[mbIndex] = '\0';
? ?
? ? return mbIndex;
}
int main(int argc, char *argv[])
{?
? ? char16_t ch = u'好';
? ? char chBuffer[64];
? ? mbstate_t state = { };
? ?
? ? size_t length = c16rtomb(chBuffer, ch, &state);
? ? chBuffer[length] = '\0';
? ?
? ? printf("The UTF-8 character length is: %zu, and the character is: %s\n", length, chBuffer);
? ?
? ? const char *utf8Str = u8"你好, 世界。";
? ? printf("The UTF-8 string is: %s\n", utf8Str);
? ?
? ? const char16_t *utf16Str = u"你好, 世界。";
? ? printf("The utf16 string length is: %zu\n", UTF16StrLen(utf16Str));
? ?
? ? length = UTF16ToUTF8(chBuffer, utf16Str);
? ?
? ? printf("The UTF-8 string length is: %zu, and the content is: %s\n", length, chBuffer);
? ?
? ? printf("If the converted UTF-8 string is equal to the original one? %s\n", strcmp(chBuffer, utf8Str) == 0? "YES" : "NO");
}
在上述代码中,
由于UTF8编码格式的字符串对ASCII是兼容的,因此我们可以直接使用C90提供的strlen等标准库对它们进行操作。