【问题标题】:NSString: dealing with UTF8-based APINSString:处理基于 UTF8 的 API
【发布时间】:2015-04-16 18:35:40
【问题描述】:

当我从 UITextField 获取键入的内容时,哪个字符集是 NSString 的默认字符集?

我开发了一个应用程序,它将此类 NSStrings 发送到基于 UTF8 的 REST-API。在后端,有一个基于 utf8 的 MySQL 数据库和基于 utf8 的 varchar-fields。 我的 POST-Request 将字符串数据从 iOS 应用程序发送到服务器。通过 GET-Request 我从 REST API 接收这些字符串。

在应用程序中,一切都打印得很好。特殊的 UTF-8 字符(如 ÄÖÜ)在将它们发送到服务器并接收回来后会正确显示。

但是当我进入 REST API 的服务器的 mysql-console 并在这些数据上执行 SELECT-Command 时,会看到损坏的字符。

根本原因可能是什么? Apple 在哪个字符集中使用 NSString?

【问题讨论】:

    标签: ios mysql objective-c utf-8 nsstring


    【解决方案1】:

    这听起来像是服务器问题。检查您使用的版本是否支持 UTF-8,旧版本不支持。见:How to support full Unicode in MySQL database

    MySQL 的 utf8 编码不同于正确的 UTF-8 编码。它不提供完整的 Unicode 支持。

    MySQL 5.5.3(2010 年初发布)引入了一种名为 utf8mb4 的新编码,它映射到正确的 UTF-8,因此完全支持 Unicode。

    NSString 的内部表示本质上是不透明的。

    UITextField 方法 text 返回一个 NSString

    如果您希望将字符串中的数据用于发送到服务器,请使用- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding 并指定编码,例如NSUTF8StringEncoding

    NSData *textFieldUTF8Data = [textFieldInstance.text dataUsingEncoding: NSUTF8StringEncoding];
    

    【讨论】:

    • utf8mb4,顾名思义,添加了 4 字节的 utf8 字符。这些出现在一些汉字、一些新的表情符号和其他一些情况中。如果您不使用其中任何一个,则 utf8mb4 不相关。
    • 4字节的UTF-8字符不仅仅是“几个汉字,一些新表情”。大多数表情符号字符位于平面 1 中,并且需要 4 个字节用于 UTF-8、UTF-16 或 UTF-32 编码。问题是 MySQL 只为其非标准的“utf8”分配了 3 个字节,并将其命名为支持 UTF-8——“bad MySQL”。这一直有效,直到角色被放入平面 1。 UTF-8 是一到四个字节。请注意,在许多情况下,用户是使用表情符号和其他平面 1 字符的用户,不支持它们既短视又限制了用户。
    【解决方案2】:

    如果“mysql控制台”指的是Windows中类似DOS的窗口,那么你需要:

    命令“chcp”控制“代码页”。 chcp 65001 提供 utf8,但它也需要安装一个特殊的字符集。一些代码页 要在控制台窗口中设置字体:右键单击窗口标题 → 属性 → 字体 → 选择 Lucida Console

    另外,通过 SET NAMES utf8mb4 告诉“控制台”您的字节是 UTF8。

    【讨论】:

    • 我正在使用 MAC 并通过 SSH 连接到服务器终端
    • 对不起,我不知道“终端”是否已经是 utf8-savvy。如果不是,如何做到这一点。你仍然需要SET NAMES utf8mb4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2017-08-15
    • 2013-04-06
    • 2016-09-11
    相关资源
    最近更新 更多