http协议中,url中的MBCS处理比较复杂。同时涉及到字符集编码和Escape两方面。根据http协议,url中的MBCS(多字节字符集)需要进行Escape(转义)。
但url中的中文不同,它需要向服务器进行提交。
具体地说,对于url中的ascii字符不需要Escape,而对于MBCS字符,需要在16进制字符编码的每一个字节前面加一个%。
除此之外,根据服务器所支持的字符集不同,%号后面的字节要写成对应的编码格式。
例如,一个url中包含一个MBCS字符,中文"哈"。其utf-8的编码值是两个字节: 54 C8,而GBK编码值也是两个字节:B9 FE。那么根据服务器的协议其url应分别编码为:
如果服务器支持的字符集为utf-8,对应的url编码为:http://192.168.1.1/test?content=%54%C8
如果服务器要求采用“GBK"编码,则这个url应编码为:http://192.168.1.1/test?content=%B9%FE
所以,一个含中文的url,是否需要编码,以及采用什么字符集编码,还要根据服务器的具体情况而论。然后再进行Escape。
此外,由于oc本身是用utf-8存储字符的,如果服务器支持utf-8编码,则url中的中文字符不需要任何转换可以直接使用。
在OC中,CFURLCreateStringByReplacingPercentEscapesUsingEncoding和stringByAddingPercentEscapesUsingEncoding两个方法就是专门用于对url中的MBCS进行编码和转义的。
因此,当url地址中含有中文字符时,需要使用如下代码:
+(NSString *) urlEncodeWithGBK: (NSString *) url
{
NSString *result;
NSStringEncoding enc=CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
//先用GBK编码,再url编码
result=[url stringByAddingPercentEscapesUsingEncoding:enc];
return result;
}
@font-face {
font-family: "宋体";
}@font-face {
font-family: "Cambria";
}@font-face {
font-family: "Heiti SC Light";
}@font-face {
font-family: "Menlo Regular";
}p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 10pt; font-size: 12pt; font-family: "Times New Roman"; }div.Section1 { page: Section1; }
想打印一个字符串的 gbk编码,可以用以下代码:
// unicode
转
GBK
编码,因为
o-c
默认使用
unicode
NSStringEncoding
enc=
CFStringConvertEncodingToNSStringEncoding
(
kCFStringEncodingMacChineseSimp
);
NSData
* data=[
@"
哈
"
dataUsingEncoding
:enc];
NSLog
(
@"
编码
:%@"
,data);
打印结果为:
编码
:<b9fe>
>
如果想打印unicode编码,使用:
NSStringEncoding
enc=
CFStringConvertEncodingToNSStringEncoding
(
kCFStringEncodingMacChineseSimp
);
NSData
* data=[
@"
哈
"
dataUsingEncoding
:
NSUTF16BigEndianStringEncoding
];
NSLog
(
@"
编码
:%@"
,data);
其中unicode编码指定为
NSUTF16StringEncoding
=
NSUnicodeStringEncoding(
二者完全等同
)
,而所谓
NSUTF16BigEndianStringEncoding
则在
NSUTF16StringEncoding
的基础上另外指定了字节序为big_endian(高位在后)。
打印结果为:
编码
:<54c8>
*注:
big_endian或little_endian来自格列弗游记中小人国的故事。小人国国王曾命令水煮蛋必需由little_end(小的一端)开始剥,而惹恼了喜欢从big_end开始剥的人。于是这两派人被称作little_endian和big_endian
。
在计算机中,big_endian和little_endian分别表示大数在内存中存放字节顺序:高位结尾,低位结尾。
例如,数字
0x11223344(32
位数
),
这其中位数最高的位是11,位数最低的位是44。这种方式就是以低位结尾,即little_endian。Little_endian是符合人类阅读习惯的。
而在internet中,多使用big_endian,即little_endian的反序(高位结尾)。
数字0x11223344应该表示位0x44332211。 Big_endian可以简单地认为是人类习惯顺序的反序。
由于java使用的字节序一般是big_endian的(这也是internet使用的字节序,称为网络序)。如果o-c要向java发送数据,应该先转为网络序(big_endian)。
NSString有一个defaultCStringEncoding,即默认的字符编码,其值为
30,NSMacOSRomanStringEncoding
。
分享到:
相关推荐
。。。
。。。
1.实现Unicode16le Unicode16be utf-8 mbcs文件编码的转化 2.实现十六进制内容转换输出
utf8 宽字节 mbcs 随意转换 vtString WStringToUTF8(const wchar_t* wstring); vtString2 UTF8ToWString(const char *string_utf8); vtString WStringToMBCS(const wchar_t* wstring); vtString2 MBCSToWString...
升级VC6源码到VC2002等高版本,自动添加TEXT(),自动将strcpy等字符串函数改为_tcscpy等函数,使代码适应于UNICODE和MBCS版本。
非UTF8编码的解压缩 提取使用MBCS(多字节字符集)编码的文件名的zip文件,例如在MS Windows(尤其是东亚环境)中创建的ZIP文件。 按语言划分的主要非UTF8编码: 朝鲜语:cp949,euc-kr 日语:sjis(shift_jis),cp...
获取字符串中的汉字。MBCS编码只是一种汉字的编码方式,还有很多种编码方式,例如使用比较国际话的uncoide编码,如果是uncoide编码就不能使用IsDBCSLeadByte方法来判断。
DBUnit导数据报表名超长和MBCS字段被截断日志,通过异常和对源码的分析,终于找到了答案,附件是调试过程中的输出结果
一个组播的源代码,可以加入一个组播,然后可以往这个组播上发送数据
MOATB Core Services driver for Linux v2.13.6.
对huffman的解码与编码Build Log --------------------Configuration: resoure - Win32 Debug-------------------- Command Lines Creating temporary file "C:\Users\lenovo\AppData\Local\Temp\RSP40CD.tmp" ...
采用VC++动态调用方式实现MBCS和UNICODE的两种动态库之间的自动切换调用。 首先,申明预定义MBCS和UNICODE模式要调用动态库文件名 然后,采用LoadLibrary( szRunDllPath ); 进行动太库的装载 最后,进行接口申明 如...
This file is subject to the terms and conditions of the GNU General Public License. See the file COPYING in the main directory of this archive for more details.
可以选择MBCS多字节编码方式,此方式一般为计算机本地化后的内码,或者选择Unicode编码方式,此方式编码的区间更大,可以兼容更多的字符集。 2、取模设置 Rotate 取模顺时针旋转角度,可以选择0,90,180,270度。...
bandzip是一款轻量级、快速且整合程度较高很好用的解压缩...ZIP格式的文件名支持Unicode或MBCS编码;支持创建ZIP/7z格式的多卷压缩包。 二、针对解压缩功能: 支持7Z,ACE,AES,ALZ,ARJ,BH,BIN,BZ,BZ2,CAB,Compound(M
用于多字节字符编码 (MBCS) 的 MFC 库 (DLL) 不再包含于 Visual Studio 中,但可用作 Visual Studio 加载项,你可以在具有 Visual Studio Professional、Visual Studio Premium或 Visual Studio Ultimate 的任何...
前端项目-socket.io-stream,socket.io流
(添加/删除/重命名)、对ZIP格式的文件名支持Unicode或 MBCS编码、AES256算法加密等实用功能,可以轻松地查看压缩包的文件列表、通过对文件完整性的检查来判断压缩包是否受损、对代码页进行更改的功能以及集成到资源...
(添加/删除/重命名)、对ZIP格式的文件名支持Unicode或 MBCS编码、AES256算法加密等实用功能,可以轻松地查看压缩包的文件列表、通过对文件完整性的检查来判断压缩包是否受损、对代码页进行更改的功能以及集成到资源...
原来的代码是VS2010编译的,现升级为VS2013后出现VS2013error MSB8031: Building an MFC project for a non-Unicode character set is deprecated。. You must change the project property to Unicode or download ...