【问题标题】:Byte array to utf8 string字节数组到 utf8 字符串
【发布时间】:2010-10-19 19:31:23
【问题描述】:

如何将我的字节数组转换为处理瑞典字母 å ä ö 的字符串?

我现在这样做: NSString *hexString = [NSString stringWithFormat:@"%c", resData[i]];

(resData 包含 ascii 字符) 但是,当我在输出标签中使用 hexString 时,我会为所有非英文字符感到乱码。 如何将选定的字节转换为处理瑞典字符的编码?

问候 丹尼尔

【问题讨论】:

    标签: objective-c string ascii byte


    【解决方案1】:

    我不明白.. 从 NSString 参考你有:

    - (id)initWithBytes:(const void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding
    

    所以你应该这样做

    [[NSString alloc] initWithBytes:resData 
                      length:yourLength
                      encoding:NSUTF8StringEncoding]
    

    【讨论】:

    • 但如果我这样做,我如何获得特定的 resData?我知道整个 resData 数组的长度。例如,我想获取 resData[i] 并将其显示为字符串。
    • 你的意思是你只想转换一个字符?
    • 那行不通。如果您的数组是字节数组,那么许多字节将代表 UTF8 中的单个字符。您应该首先将整个数组转换为字符串,然后提取单个字符.. UTF8 具有可变大小的字符,因此仅获取第 i 个字符是行不通的
    • 但是如果一个字节代表一个字符,那么这就是我需要的字符,并且想让它不乱码。需要取一个特定字节并将其转换为 utf8 或任何可以显示 å ä ö
    • 我已经告诉过你,例如埃在 UTF8 中具有 U+00C5 编码,这是 2 个字节而不仅仅是一个。你不能通过每个读取一个字节来获得它。
    【解决方案2】:

    resData 不包含 ASCII 字符,因为 ASCII 不包含 å、ä 和 ö 字符。如果resData 是一个 UTF-8 编码的字符串,那么某些字符(包括这些字符)使用多个字节进行编码。

    看起来您想要一种打印第 *n* 个字符的方法。首先,按照@Jack 说的做,把这些字节变成NSString

    /* Assuming |resData| is NULL-terminated and UTF-8 encoded... */
    NSString *text = [NSString stringWithUTF8String:resData];
    

    现在,打印text的第*n*个字符:

    NSUInteger n = 3;
    NSString *character = [text substringWithRange:NSMakeRange(n, 1)];
    NSLog(@"character #%d: %@", n, character);
    

    您还可以将character 设置为控件的字符串值。它应该显示得很好。

    关键要点:byte[i] 不一定与*i*th 字符相同。文本总是被编码的,你必须总是(痛苦地)意识到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-17
      • 2013-09-14
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2021-01-03
      相关资源
      最近更新 更多