NSString:处理基于 UTF8 的 API

NSString: dealing with UTF8-based API

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

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

接收到这些字符串

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

但是当我进入 REST API 服务器的 mysql- 控制台并对这些数据执行 SELECT- 命令时,可以看到损坏的字符。

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

听起来像是服务器问题。检查您使用的版本是否支持 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方法textreturns一个NSString.

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

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

如果通过 "mysql console",您指的是 Windows 中的 DOS-like window,那么您需要:

命令 "chcp" 控制 "code page"。 chcp 65001 提供 utf8,但它也需要安装一个特殊的字符集。一些代码页 在控制台中设置字体window:Right-click标题上的window→属性→字体→选择Lucida Console

另外,通过 SET NAMES utf8mb4 告诉 'console' 你的字节是 UTF8。