[IOS微信] Unicode码 转化为字符串

摘要:
最近,我们正在研究IOS手机备份的数据。在微信数据中,每个微信帐户对应一个文件:mmsetting.archive,用于保存该帐户的详细信息。此文件是一个增强的plist文件。此文件是二进制数据。其中的汉字以Unicode码存储,这个码点被分成两个数字。正确的方法是将Unicode代码直接添加到wstring对象std::wstringstr;intc;c=95*16*16+174;//获取unicode code_back对应的整数str.push;//此函数只能添加单个字符。在宽字节环境中,每个字符的unicode代码是唯一的c=79*16*16+225;str.push_返回;c=86*16*16+226;str.push_返回;c=150*16*16+31;str.push_返回;一般函数如下:staticstringunicode2string{std::wstringstr;intcode=0;unsigned charc1,c2;autoit=charBytes.begin();while(it!

最近在研究IOS手机备份的数据,里面的微信数据中,每一个微信账号对应一个文件:mmsetting.archive

用来保存此账号的详细信息。

该文件是一个加强版的plist文件(此文件使用的是plist格式,但却包含汉字)

该文件是二进制数据,其中的汉字保存的是Unicode码,并且这个码位是被拆分成2个数字的。例如:

95, 174, 79, 225, 86, 226, 150, 31

对应的是:“微信团队” 四个字

转换为字符串: char* s1 = "u5faeu4fe1u56e2u961f";   //很简单吧

(95, 174 对应于“微” 字 ,它们的十六进制分别是:0x5f  , 0xae   .以此类推)

但是,我们从文件中获取的汉字很多,并且是不确定的。所以,代码里应该是这样的:

CString s1;
s1.Format(L"\u%x%x\u%x%x\u%x%x\u%x%x", 95, 174, 79, 225, 86, 226, 150, 31);

这样得到的是字符串:u5faeu4fe1u56e2u961f   ,而不是汉字,明显是错误的。(使用std::wstring 也一样)

正确的方法应该是:直接把Unicode码 添加进wstring对象

    std::wstring str;
    int c;
    c = 95 * 16 * 16 + 174; //得到unicode码对应的整型
    str.push_back(c);   //这个函数只能添加单个字符,而在宽字节环境下,每个字符的unicode码是唯一的

    c = 79 * 16 * 16 + 225;
    str.push_back(c);

    c = 86 * 16 * 16 + 226;
    str.push_back(c);

    c = 150 * 16 * 16 + 31;
    str.push_back(c);    

通用函数如下:

static wstring unicode2string(const vector<unsigned char>& charBytes)
{
    std::wstring str;
    int code = 0;
    unsigned char c1, c2;
    auto it = charBytes.begin();
    while ( it != charBytes.end())
    {
        c1 = *it;
        if (++it != charBytes.end())
        {
            c2 = *it;
            code = c1 * 16 * 16 + c2;
            str.push_back(code);

            ++it;
        }
    }

    return str;
}

 不能使用std::string

免责声明:文章转载自《[IOS微信] Unicode码 转化为字符串》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇毕业设计 python opencv实现车牌识别 预处理KendoUI 用下来的小总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

sql server中字符串无法替换空格的问题

直接上代码: select case when 'workReport'=LTRIM(RTRIM(' workReport ')) then 'trim去空格成功' when 'workReport'=REPLACE(' workReport ',' ','') then 'replace去空格成功' when 'workReport'=REPLACE('...

SqlSerVer 列与逗号分隔字符串 互相转换

在项目中,使用SQLServer数据库,有一个需求,需要将数据库的某一列,转换成逗号分隔的字符串。同时,需要将处理完的字符串,转换成为一列。 经过查阅资料与学习,通过以下方式可以实现如上所述需求: 1、编写一个表值函数,传入一个字符串,实现转换成列,条件以逗号分隔(任何符号都可以自定义) //空格分隔的字符串 CREATE FUNCTION [db...

Unicode和中午互转

import java.io.UnsupportedEncodingException; public class TestUnicode{ /* * 中文转unicode编码 */ public static String gbEncoding(final String gbString) { char[] utfBytes = gbString.to...

VB 的字符串处理函数

一、InStr 返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。 语法 InStr([start, ]string1, string2[, compare]) start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compar...

Postgresql数据库的一些字符串操作函数(转)

今天做项目遇到客户反映了一个麻烦的事情,有一些数据存在,但就是在程序中搜索不出来,后来分析,发现问题为数据前面有几个空白字符,后来用SQL 查询了一下,发现八九个数据表中,数千万条数据中有将近三百万条数据存在相同的问题,本想着在查询时添加匹配符'%',后来试运行了一下,发现不可行,因 为尚有很多其它页面存在类似的搜索问题,并且这样会极大地影响到查询的速度,...

R3下LoadLibrary初探

  LoadLibraryA/LoadLibraryW->LoadLibraryExA->LoadLibraryExW   到LoadLibraryExA后把第一个参数为dll路径,把路径改成Unicode字符串,再把Unicode字符串地址指针传给LoadLibraryExW.   调用方法如下   hook函数LoadLibrary防止远程注入D...