Ron*_*Ron 4 iphone unicode ios
我正在使用包含UTF32字符的十六进制代码的数据库.我想把这些字符存储在NSString中.我需要有两种方式转换的例程.
要将NSString的第一个字符转换为unicode值,此例程似乎有效:
const unsigned char *cs = (const unsigned char *)
[s cStringUsingEncoding:NSUTF32StringEncoding];
uint32_t code = 0;
for ( int i = 3 ; i >= 0 ; i-- ) {
code <<= 8;
code += cs[i];
}
return code;
Run Code Online (Sandbox Code Playgroud)
但是,我无法做反向(即采用单个代码并将其转换为NSString).我想我可以通过简单地创建一个带有UTF32字符的c字符串,并按照正确的顺序使用字节,然后使用正确的编码从中创建一个NSString.
但是,转换到cstrings /从cstrings转换对我来说似乎并不可逆.
例如,我尝试过这段代码,"tmp"字符串不等于原始字符串"s".
char *cs = [s cStringUsingEncoding:NSUTF32StringEncoding];
NSString *tmp = [NSString stringWithCString:cs encoding:NSUTF32StringEncoding];
Run Code Online (Sandbox Code Playgroud)
有谁知道我做错了什么?我应该使用"wchar_t"作为cstring而不是char*吗?
任何帮助是极大的赞赏!
谢谢,罗恩
Lil*_*ard 14
你有几个合理的选择.
第一种是将UTF32转换为UTF16并使用NSString,因为UTF16是NSString的"本机"编码.实际上并不是那么难.如果UTF32字符在BMP中(例如,它的高两个字节是0),您可以直接将其转换为unichar.如果它在任何其他平面中,您可以将其转换为代表性的UTF16字符对.您可以在维基百科页面上找到规则.但是快速(未经测试)的转换看起来像
UTF32Char inputChar = // my UTF-32 character
inputChar -= 0x10000;
unichar highSurrogate = inputChar >> 10; // leave the top 10 bits
highSurrogate += 0xD800;
unichar lowSurrogate = inputChar & 0x3FF; // leave the low 10 bits
lowSurrogate += 0xDC00;
Run Code Online (Sandbox Code Playgroud)
现在,您可以同时使用两个字符创建NSString:
NSString *str = [NSString stringWithCharacters:(unichar[]){highSurrogate, lowSurrogate} length:2];
Run Code Online (Sandbox Code Playgroud)
要向后移动,您可以使用[NSString getCharacters:range:]以获取unichar,然后反转代理对算法以获取您的UTF32字符(任何不在范围内的字符0xD800-0xDFFF应该直接转换为UTF32).
您的另一个选择是让NSString直接执行转换而不使用cStrings.要将UTF32值转换为NSString,您可以使用以下内容:
UTF32Char inputChar = // input UTF32 value
inputChar = NSSwapHostIntToLittle(inputChar); // swap to little-endian if necessary
NSString *str = [[[NSString alloc] initWithBytes:&inputChar length:4 encoding:NSUTF32LittleEndianStringEncoding] autorelease];
Run Code Online (Sandbox Code Playgroud)
要再次取消它,您可以使用
UTF32Char outputChar;
if ([str getBytes:&outputChar maxLength:4 usedLength:NULL encoding:NSUTF32LittleEndianStringEncoding options:0 range:NSMakeRange(0, 1) remainingRange:NULL]) {
outputChar = NSSwapLittleIntToHost(outputChar); // swap back to host endian
// outputChar now has the first UTF32 character
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4764 次 |
| 最近记录: |