将UTF8编码转化为中文 - NSString方法

方法一:

代码如下,如有更好的方法 麻烦贴出来,这个方法是通过webview进行解码的

UIWebView *web = [[UIWebView alloc] init];

NSString *tsw = @"%E4%B8%AD%E5%9B%BD";

NSString *sc = [NSString stringWithFormat:@"decodeURIComponent(‘%@‘)",tsw];

NSString *st = [web stringByEvaluatingJavaScriptFromString:sc];

NSLog(st);

[web release];

方法二:

测试了一下,搞定了,用NSString的stringByReplacingPercentEscapesUsingEncoding方法就可以了,可以这样子:

NSString* strAfterDecodeByUTF8AndURI = [@"%E4%B8%AD%E5%9B%BD" stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSLog(@"strAfterDecodeByUTF8AndURI=%@", strAfterDecodeByUTF8AndURI);

这个问题的本质时,首先这段内容是utf-8编码,然后又进行了URL Encode,所以解码的时候,先URL Decode,再utf-8解码即可

什么是url encode参见 http://www.stringfunction.com/url-decode.html

所以

stringByReplacingPercentEscapesUsingEncoding 方法是用于url decode

然后其中的参数NSUTF8StringEncoding是指定了UTF-8编码即可

=================================

关于 http://www.cocoachina.com/bbs/read.php?tid-16787.html的实现,也做了些分析如下:

从原理上解释下这种做法。

编码定义,见下面的c)

A: There are three or four options for making Unicode fit into an 8-bit format.

a) Use UTF-8. This preserves ASCII, but not Latin-1, because the characters >127 are different from Latin-1. UTF-8 uses the bytes in the ASCII only for ASCII characters. Therefore, it works well in any environment where ASCII characters have a significance as syntax characters, e.g. file name syntaxes, markup languages, etc., but where the all other characters may use arbitrary bytes.

Example: “Latin Small Letter s with Acute” (015B) would be encoded as two bytes: C5 9B.

b) Use Java or C style escapes, of the form /uXXXXX or /xXXXXX. This format is not standard for text files, but well defined in the framework of the languages in question, primarily for source files.

Example: The Polish word “wyj?cie” with character “Latin Small Letter s with Acute” (015B) in the middle (? is one character) would look like: “wyj/u015Bcie".

c) Use the &#xXXXX; or &#DDDDD; numeric character escapes as in HTML or XML. Again, these are not standard for plain text files, but well defined within the framework of these markup languages.

Example: “wyj?cie” would look like “wyjście"

d) Use SCSU. This format compresses Unicode into 8-bit format, preserving most of ASCII, but using some of the control codes as commands for the decoder. However, while ASCII text will look like ASCII text after being encoded in SCSU, other characters may occasionally be encoded with the same byte values, making SCSU unsuitable for 8-bit channels that blindly interpret any of the bytes as ASCII characters.

Example: “<SC2> wyjÛcie” where <SC2> indicates the byte 0x12 and “Û” corresponds to byte 0xDB.

如c所描述,这是一种“未标准"但广泛采用的做法,说是山寨编码也行 :-)

所以编码过程是

字符串 -> Unicode编码 -> &#xXXXX; or &#DDDDD;

解码过程反过来即可

注意:由于这种编码方式是“山寨”未“标准”的编码,所以iPhone的SDK没有支持(无法向上面utf-8编码一样),只能自己搞定(也不是很难了,见dboylx的实现)

时间: 2024-09-30 14:10:00

将UTF8编码转化为中文 - NSString方法的相关文章

Visual Studio 2019 UTF-8编码调试显示中文

本地版本 Microsoft Visual Studio Community 2019 [1]Visual Studio 2019 UTF-8编码调试显示中文 (1)设置string默认编码为utf-8,只需要在头文件中加入以下代码: #pragma execution_character_set("utf-8") // 默认使用UTF-8 (2)修改stl.natvis文件(大约753~756行) 文件位置:建议使用everything直接搜索文件名 参考本地位置:E:\Progra

Latex中文utf-8编码的三种方式

我们知道Latex一般用CJK和CTEX宏包支持中文编辑,CJK和CTEX的默认编码是GBK,而windows下的默然编码就是GBK,因此CJK和CTEX不需要特殊配置就可以直接支持中文Latex编译,只需要用GBK编码保存文件即可.但是如果把文件的字符编码换成现在更加普遍的utf-8的话,应该怎么操作呢?在这里有3种方式可以使用. 1.CJKutf8 CJK有两个基本宏包:CJK和CJKutf8,其中后者面向utf-8编码,其一般使用方法如下: \usepackage{CJKutf8} \be

Java socket 以byte[]简单分片传送数据(&quot;UTF-8&quot;编码)

我们选用的流是DataOutputStream和DataInputStream,下次再详解java中的各种流的区别. 1.我们先创建对象: 1 private DataOutputStream outputStream = null; 2 private DataInputStream inputStream = null; 2.然后可在构造方法中使用传入的socket对刚创建的对象定义: 1 public ClientHandleThread(Socket socket) { 2 this.s

解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG

解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG [email protected] http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-6-6 方法一: 出处:http://blog.csdn.net/leonzhouwei/article/details/8447643 直接用 Excel 打开 UTF-8 编码的 CSV 文件会导致汉字部分出现乱码. 原因是 Excel 以 ANSI 格式打开,不会做编码识别. 打开 UTF-8 编

字符编码简介:ASCII,Unicode,UTF-8,GB2312及Unicode和UTF-8如何转化

参考: http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html http://www.cnblogs.com/mjgforever/archive/2008/02/27/1083135.html 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可

宽字符、多字节、unicode、utf-8、gbk编码转化

今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型. 我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符. 我们在编程的时候经常遇到unicode,unicode是一种宽字节编码,能够很好的融合世界各个国家的字符,具有国际通用性,所谓宽字符其实使用两个字节来表示一个符号. 而utf8是一种多字节编码,一个字符所占用的字节数不确定,是对unicode的精简版本,也用具有世界通用性.Gbk也是一种双字节编码,其实就是对中文简体的一种编码,不具有世界通

Windows下VC++显示UTF-8编码中文

笔者在Windows下使用C++编写程序接收UTF8字符串会发生中文无法正常在console上显示的问题,故特来解决UTF8字符串如何在VC++上正常显示. 1.问题重现,UTF-8编码下的字符串“中文”在Windows下的显示如下图,其中上行为UTF8字符串,下行为GBK字符串: 2.方法:将UTF-8格式的代码变为GBK编码(需要Windows.h头文件) 1 string UTF8ToGBK(string &strUtf8) 2 { 3 string strOutGBK = "&q

Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)

一.登录MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,显示如下:+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | utf8 || character_set_connectio

编码(ACSII unicod UTF-8)、QT输出中文乱码深入分析

总结: 1. qt输出中文乱码原因分析 qt的编程环境默认是utf-8编码格式(关于编码见下文知识要点一): cout << "中文" << endl; 程序运行,程序并不认识ANSI,UTF-8以及任何其他编码.系统只知道处理你给它的字符的二进制表示. 关于  "中""文" 的3种编码二进制内容: ANSI(GBK): 0xd6d0  0xcec4 UTF-8: 0xe4b8ad 0xe69687 Unicode: 0x