【问题标题】:Error converting NSString to C-String将 NSString 转换为 C-String 时出错
【发布时间】:2013-10-31 13:31:57
【问题描述】:

我正在尝试使用以下调用将 NSString 转换为 C-String`:

NSString* path = ...
const char* str = [path cStringUsingEncoding: NSUTF16StringEncoding];

path 包含一个文件路径。但是,我得到的 str 只是“/”。当我改用这个调用时:

const char* str = [path UTF8String];

返回的str 很好,即我将所需的路径作为 c 字符串。但是,无论路径中使用的类型编码如何,我都需要确保转换在所有情况下都有效,即我想处理 unicode 字符。为此,我需要使用初始调用。

我犯了什么错误?

【问题讨论】:

    标签: c++ objective-c unicode nsstring unicode-string


    【解决方案1】:

    这是因为您选择的编码。 UTF-16 将返回 16 位字符,而您需要 8 位字符(即 UTF-8)。

    因此,如果路径以/ 开头,则将返回为0x2F00(假设为小端编码),00 序列将看起来字符串结尾

    【讨论】:

    • 没错。但是,如何确保代码处理所有 unicode 字符?
    • @Sankalp 不确定你真的可以。每种类型的 unicode 编码(UTF-8、-16、-32)以及每种类型的字节序(大字节序和小字节序)都需要特殊处理。我认为您应该始终期望并处理 UTF-8,仅此而已。如果您有外部编码的字符串(例如,在文件中),则应在程序处理之前将这些字符串转换为 UTF-8(即在加载时)。
    • 所以,我想,我只需要祈祷路径在加载时被 UTF-8 编码!
    • @Sankalp 无需祈祷。您使用的方法具有显式行为,因此您知道将收到的字符串的编码。
    • 那么,你的意思是有一种方法可以识别我得到的 NSString 的编码吗?如果是,那将有很大帮助。
    【解决方案2】:

    您应该尝试使用 UTF8 编码这个 '\' 你得到的将是第一个 NSString ......在 c 中每个字符需要 1 个字节(8 位),但 UTF16 使字符长 2 个字节......所以会发生错误

    【讨论】:

      猜你喜欢
      • 2016-04-07
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多