【问题标题】:Using the right encoding with NSString对 NSString 使用正确的编码
【发布时间】:2013-01-25 16:46:56
【问题描述】:

我从一个网站获得 unicode 文本并将其保存到 NSString,问题是字符串中的文本未正确编码,所以我只看到符号。 网站上的文字主要是希伯来文字。

NSLog(@"%@", [trafficNodes[0] firstChild]);
NSLog(@"%@", [[trafficNodes[0] firstChild] content]);
NSLog(@"%@", [[[trafficNodes[0] firstChild] content] stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding]);

这是我在日志中看到的:

2013-01-25 18:44:26.391 HTMLParsing[2450:c07] {
nodeContent = "\U05f3\U009e\U05f3\U00a2\U05f3\U2022\U05f3\U201c\U05f3\U203a\U05f3\U009f \U05f3\U009c\U05f3\U00a9\U05f3\U00a2\U05f3\U201d: 18:35\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0\U05f3\U201d\U05f3\U00d7\U05f3\U00a0\U05f3\U2022\U05f3\U00a2\U05f3\U201d \U05f3\U2013\U05f3\U2022\U05f3\U00a8\U05f3\U009e\U05f3\U00d7.\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0***\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0\U05f3\U009c\U05f3\U009e\U05f3\U00a1\U05f3\U2122\U05f3\U00a8\U05f3\U00d7 \U05f3\U2022\U05f3\U009c\U05f3\U00a7\U05f3\U2018\U05f3\U009c\U05f3\U00d7 \U05f3\U201c\U05f3\U2122\U05f3\U2022\U05f3\U2022\U05f3\U2014\U05f3\U2122\U05f3\U009d \U05f3\U2022\U05f3\U00d7\U05f3\U2013\U05f3\U009e\U05f3\U2022\U05f3\U00a0\U05f3\U2122\U05f3\U009d \U05f3\U2014\U05f3\U2122\U05f3\U2122\U05f3\U2019\U05f3\U2022: 918 - 800 - 1-800\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0\U05f3\U2018\U05f3\U00a0\U05f3\U00a1\U05f3\U2122\U05f3\U00a2\U05f3\U201d \U05f3\U2018\U05f3\U00a7\U05f3\U00a8\U05f3\U2018\U05f3\U00d7 \U05f3\U2018\U05f3\U00d7\U05f3\U2122 \U05f3\U00a1\U05f3\U20aa\U05f3\U00a8, \U05f3\U2019\U05f3\U2122\U05f3\U00a0\U05f3\U2022\U05f3\U00d7 \U05f3\U009e\U05f3\U00a9\U05f3\U2014\U05f3\U00a7\U05f3\U2122\U05f3\U009d \U05f3\U2022\U05f3\U009e\U05f3\U00d7\U05f3\U00a0\"\U05f3\U00a1\U05f3\U2122\U05f3\U009d \U05d2\U20ac\U201c \U05f3\U2122\U05f3\U00a9 \U05f3\U009c\U05f3\U201d\U05f3\U2022\U05f3\U00a8\U05f3\U2122\U05f3\U201c \U05f3\U009e\U05f3\U201d\U05f3\U2122\U05f3\U00a8\U05f3\U2022\U05f3\U00d7, \U05f3\U2019\U05f3\U009d \U05f3\U203a\U05f3\U00a9\U05f3\U201d\U05f3\U203a\U05f3\U2018\U05f3\U2122\U05f3\U00a9 \U05f3\U20aa\U05f3\U00a0\U05f3\U2022\U05f3\U2122. \U05f3\U2018\U05f3\U201d\U05f3\U2019\U05f3\U2122\U05f3\U00a2\U05f3\U203a\U05f3\U009d \U05f3\U009c\U05f3\U009e\U05f3\U00a2\U05f3\U2018\U05f3\U00a8 \U05f3\U2014\U05f3\U00a6\U05f3\U2122\U05f3\U2122\U05f3\U201d \U05d2\U20ac\U201c \U05f3\U0090\U05f3\U20aa\U05f3\U00a9\U05f3\U00a8\U05f3\U2022 \U05f3\U00d7\U05f3\U009e\U05f3\U2122\U05f3\U201c \U05f3\U2014\U05f3\U00a6\U05f3\U2122\U05f3\U2122\U05f3\U201d \U05f3\U009c\U05f3\U2122\U05f3\U009c\U05f3\U201c \U05f3\U201d\U05f3\U009e\U05f3\U2018\U05f3\U00a7\U05f3\U00a9 \U05f3\U009c\U05f3\U2014\U05f3\U00a6\U05f3\U2022\U05f3\U00d7. \U05f3\U201d\U05f3\U2122\U05f3\U2022 \U05f3\U201c\U05f3\U00a8\U05f3\U2022\U05f3\U203a\U05f3\U2122\U05f3\U009d, \U05f3\U00a2\U05f3\U00a8\U05f3\U00a0\U05f3\U2122\U05f3\U2122\U05f3\U009d \U05f3\U2022\U05f3\U009e\U05f3\U00a8\U05f3\U2022\U05f3\U203a\U05f3\U2013\U05f3\U2122\U05f3\U009d, \U05f3\U2022\U05f3\U2014\U05f3\U20aa\U05f3\U00a9\U05f3\U2022 \U05f3\U0090\U05f3\U00d7\U05f3\U009d \U05f3\U0090\U05f3\U00d7 \U05f3\U201d\U05f3\U2122\U05f3\U009c\U05f3\U201c\U05f3\U2122\U05f3\U009d \U05f3\U201d\U05f3\U00a2\U05f3\U00a9\U05f3\U2022\U05f3\U2122\U05f3\U2122\U05f3\U009d \U05f3\U009c\U05f3\U201d\U05f3\U00d7\U05f3\U20aa\U05f3\U00a8\U05f3\U00a5 \U05f3\U009c\U05f3\U203a\U05f3\U2018\U05f3\U2122\U05f3\U00a9.\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0\U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0 \U00a0\U05f3\U00a2\U05f3\U2022\U05f3\U00a8\U05f3\U009a \U05f3\U201c\U05f3\U2122\U05f3\U2022\U05f3\U2022\U05f3\U2014\U05f3\U2122 \U05f3\U201d\U05f3\U00d7\U05f3\U00a0\U05f3\U2022\U05f3\U00a2\U05f3\U201d: \U05f3\U009e\U05f3\U2022\U05f3\U00a8 \U05f3\U00a0\U05f3\U00a2\U05f3\U009e\U05f3\U009f.";
nodeName = text;
}
2013-01-25 18:44:26.392 HTMLParsing[2450:c07] ׳׳¢׳•׳“׳›׳ ׳׳©׳¢׳”: 18:35                                      ׳”׳×׳ ׳•׳¢׳” ׳–׳•׳¨׳׳×.                                      ***                   ׳׳׳¡׳™׳¨׳× ׳•׳׳§׳‘׳׳× ׳“׳™׳•׳•׳—׳™׳ ׳•׳×׳–׳׳•׳ ׳™׳ ׳—׳™׳™׳’׳•: 918 - 800 - 1-800                                      ׳‘׳ ׳¡׳™׳¢׳” ׳‘׳§׳¨׳‘׳× ׳‘׳×׳™ ׳¡׳₪׳¨, ׳’׳™׳ ׳•׳× ׳׳©׳—׳§׳™׳ ׳•׳׳×׳ "׳¡׳™׳ ג€“ ׳™׳© ׳׳”׳•׳¨׳™׳“ ׳׳”׳™׳¨׳•׳×, ׳’׳ ׳›׳©׳”׳›׳‘׳™׳© ׳₪׳ ׳•׳™. ׳‘׳”׳’׳™׳¢׳›׳ ׳׳׳¢׳‘׳¨ ׳—׳¦׳™׳™׳” ג€“ ׳׳₪׳©׳¨׳• ׳×׳׳™׳“ ׳—׳¦׳™׳™׳” ׳׳™׳׳“ ׳”׳׳‘׳§׳© ׳׳—׳¦׳•׳×. ׳”׳™׳• ׳“׳¨׳•׳›׳™׳, ׳¢׳¨׳ ׳™׳™׳ ׳•׳׳¨׳•׳›׳–׳™׳, ׳•׳—׳₪׳©׳• ׳׳×׳ ׳׳× ׳”׳™׳׳“׳™׳ ׳”׳¢׳©׳•׳™׳™׳ ׳׳”׳×׳₪׳¨׳¥ ׳׳›׳‘׳™׳©.                                      ׳¢׳•׳¨׳ ׳“׳™׳•׳•׳—׳™ ׳”׳×׳ ׳•׳¢׳”: ׳׳•׳¨ ׳ ׳¢׳׳.
2013-01-25 18:44:27.358 HTMLParsing[2450:c07] ׳׳¢׳•׳“׳›׳ ׳׳©׳¢׳”: 18:35                                      ׳”׳×׳ ׳•׳¢׳” ׳–׳•׳¨׳׳×.                                      ***                   ׳׳׳¡׳™׳¨׳× ׳•׳׳§׳‘׳׳× ׳“׳™׳•׳•׳—׳™׳ ׳•׳×׳–׳׳•׳ ׳™׳ ׳—׳™׳™׳’׳•: 918 - 800 - 1-800                                      ׳‘׳ ׳¡׳™׳¢׳” ׳‘׳§׳¨׳‘׳× ׳‘׳×׳™ ׳¡׳₪׳¨, ׳’׳™׳ ׳•׳× ׳׳©׳—׳§׳™׳ ׳•׳׳×׳ "׳¡׳™׳ ג€“ ׳™׳© ׳׳”׳•׳¨׳™׳“ ׳׳”׳™׳¨׳•׳×, ׳’׳ ׳›׳©׳”׳›׳‘׳™׳© ׳₪׳ ׳•׳™. ׳‘׳”׳’׳™׳¢׳›׳ ׳׳׳¢׳‘׳¨ ׳—׳¦׳™׳™׳” ג€“ ׳׳₪׳©׳¨׳• ׳×׳׳™׳“ ׳—׳¦׳™׳™׳” ׳׳™׳׳“ ׳”׳׳‘׳§׳© ׳׳—׳¦׳•׳×. ׳”׳™׳• ׳“׳¨׳•׳›׳™׳, ׳¢׳¨׳ ׳™׳™׳ ׳•׳׳¨׳•׳›׳–׳™׳, ׳•׳—׳₪׳©׳• ׳׳×׳ ׳׳× ׳”׳™׳׳“׳™׳ ׳”׳¢׳©׳•׳™׳™׳ ׳׳”׳×׳₪׳¨׳¥ ׳׳›׳‘׳™׳©.                                      ׳¢׳•׳¨׳ ׳“׳™׳•׳•׳—׳™ ׳”׳×׳ ׳•׳¢׳”: ׳׳•׳¨ ׳ ׳¢׳׳.

我尝试使用不同的编码,但没有成功。

编辑:

使用后:

NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);

我在日志中看到了应该写入的文本,现在如何将其转换为 NSData 而不会丢失编码?

我需要将它传递给 HTMLParser。

编辑(2):

对我有用的是使用正确的编码将 NSData 转换为 NSString 并返回:

NSString *encodedStringData = [[NSString alloc] initWithData:reportsHtmlData encoding:NSUTF8StringEncoding];
NSData *reportsHtmlDataEncoded = [encodedStringData dataUsingEncoding:CFStringConvertEncodingToNSStringEncoding (kCFStringEncodingWindowsHebrew)]; 

感谢您的帮助。

【问题讨论】:

  • 如何填充NSString 对象?您使用 HTTP 响应中定义的编码?
  • 我不知道如何找到HTTP响应中定义的编码,谢谢。
  • 这是Content-Encoding 标头:en.wikipedia.org/wiki/List_of_HTTP_header_fields。您必须使用此值来设置NSString 对象。
  • 我看到编码是windows-1255。 content="text/html; charset=windows-1255" />
  • "如何在不丢失编码的情况下将其转换为 NSData?"听起来它一开始是 UTF8 编码的数据。

标签: objective-c html-parsing nsstringencoding


【解决方案1】:

也许这可以帮助你 - NSSstring encoding not found

答案澄清了 NSString 不支持 Windows 希伯来语编码,但 CFString 支持。由于您没有提及,因此我不确切知道网页使用的编码,但希望您可以尝试一下。

【讨论】:

  • 谢谢,我尝试将使用 CFString 的编码更改为 kCFStringEncodingWindowsHebrew,但没有成功,我也不知道如何找到网页使用的编码。
【解决方案2】:

如果 initWithData:encoding: 在您将数据声明为 UTF-8 时有效,则源文本可能被编码为 UTF-8。如果 Content-Encoding 标头告诉您否则,它们可能是错误的。不幸的是,有时标题是错误的。

回答这个问题,“我怎样才能在不丢失编码的情况下将其转换为 NSData?”

你不能。

NSData 是原始字节。编码只是解释它们的一种策略。 NSData 和 NSString 都是字节序列的容器;不同之处在于 NSString 还携带编码信息,因此您可以直接使用字符(可能是一个、两个或三个字节)而不是字节。

我不确定您指的是什么 HTMLParser。如果它需要原始字节(NSData),那么您需要告诉它使用 UTF-8 编码。如果它需要一个字符串(NSString),那么您可以将新创建​​的字符串传递给它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2011-07-20
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多