怎样直接将json串直接转为gbk编码输出呢

power0811 2013-05-20 05:07:55
我拿到一个json, 不想解串, 指向直接将其当做字符串进行编码转换, 里面的所有中文譬如:
u'desc':u'<P>\u3000\u30001938\u5e743\u67083\u65e5\uff0c\u970d\u514b\u65af\u7684\u300a\u80b2\u5a74\u5947 这样的直接转成gbk编码写成文件, 要求能显示变成正常的gbk编码中文. 该怎么做 多谢
...全文
1153 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-05-22
  • 打赏
  • 举报
回复
仅供参考:
//将文件1中所有'\uAABB'替换为'\xBB'+'\xAA','C'替换为'C\x00',且文件头加'\xFF\xFE',结果保存到文件2中。
#include <stdio.h>
FILE *f1,*f2;
int c,s,n,i;
char fuAABB[7];
int AA,BB;
void main(int argc,char **argv) {
    if (argc<3) {
        printf("%s 文件1 文件2\n将文件1中所有\"\\uAABB\"替换为\"\\xBB\\xAA\",\'C\'替换为\"C\\x00\",且文件头加\"\\xFF\\xFE\",结果保存到文件2中。\n",argv[0]);
        return;
    }
    f1=fopen(argv[1],"rb");
    if (NULL==f1) {
        printf("找不到文件[%s]!\n",argv[1]);
        return;
    }
    f2=fopen(argv[2],"wb");
    if (NULL==f2) {
        fclose(f1);
        printf("创建文件[%s]出错!\n",argv[2]);
        return;
    }
    fuAABB[6]=0;
    fputc(0xFF,f2);fputc(0xFE,f2);
    s=0;
    while (1) {
        c=fgetc(f1);
        if (EOF==c) {
            for (i=0;i<s;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
            break;//
        }
        switch (s) {
        case 0:
            if ('\\'==c) {
                n=0;
                fuAABB[n++]=c;
                s=1;
            } else {
                fputc(c,f2);fputc(0,f2);
            }
        break;
        case 1:
            if ('u'==c) {
                fuAABB[n++]=c;
                s=2;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 2:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=3;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 3:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=4;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 4:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                s=5;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        case 5:
            if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {
                fuAABB[n++]=c;
                sscanf(fuAABB+2,"%02x%02x",&AA,&BB);
                fputc(BB,f2);fputc(AA,f2);
                s=0;
            } else {
                for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}
                fputc(c,f2);fputc(0,f2);
                s=0;
            }
        break;
        }
    }
    fclose(f2);
    fclose(f1);
    printf("%s %s %s OK.\n",argv[0],argv[1],argv[2]);
}
赵4老师 2013-05-22
  • 打赏
  • 举报
回复
//iconv_linux下字符集编码转换轻松实现
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
//此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
//此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。
(3) int iconv_close(iconv_t cd);
//此函数用于关闭转换句柄,释放资源。

//例子1: 用C语言实现的转换示例程序

/* f.c : 代码转换示例C程序 */
#include <iconv.h>
#define OUTLEN 255
main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "正在安装";
char out[OUTLEN];

/*unicode码转为gb2312码*/
rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf("unicode-->gb2312 out=%sn",out);
//gb2312码转为unicode码

rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf("gb2312-->unicode out=%sn",out);
}
/*代码转换:从一种编码转为另一种编码*/
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
/*UNICODE码转为GB2312码*/
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
/*GB2312码转为UNICODE码*/
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}

//例子2: 用C++语言实现的转换示例程序

/* f.cpp : 代码转换示例C++程序 */
#include <iconv.h>
#include <iostream>

#define OUTLEN 255

using namespace std;

// 代码转换操作类

class CodeConverter {

private:
iconv_t cd;
public:

// 构造
CodeConverter(const char *from_charset,const char *to_charset) {
cd = iconv_open(to_charset,from_charset);
}


// 析构
~CodeConverter() {
iconv_close(cd);
}


// 转换输出
int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
char **pin = &inbuf;
char **pout = &outbuf;

memset(outbuf,0,outlen);
return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
}
};

int main(int argc, char **argv)
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "正在安装";
char out[OUTLEN];

// utf-8-->gb2312
CodeConverter cc = CodeConverter("utf-8","gb2312");
cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);
cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl;

// gb2312-->utf-8
CodeConverter cc2 = CodeConverter("gb2312","utf-8");
cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);
cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl;
}



二、利用iconv命令进行编码转换

iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。

用法: iconv [选项...] [文件...]

有如下选项可用:

输入/输出格式规范:
-f, --from-code=名称 原始文本编码
-t, --to-code=名称 输出编码

信息:
-l, --list 列举所有已知的字符集

输出控制:
-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息

-?, --help 给出该系统求助列表
--usage 给出简要的用法信息
-V, --version 打印程序版本号

例子:
iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt
这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。

小结: Linux为我们提供了强大的编码转换工具,给我们带来了方便。


power0811 2013-05-21
  • 打赏
  • 举报
回复
linux下面输出不行
power0811 2013-05-21
  • 打赏
  • 举报
回复
这个是可以, 可为什么我将如下内容: '<P style="TEXT-INDENT: 1.99em">\u8fd9\u90e8\u5f71\u7247\u4ee5\u4eac\u90fd\u4e3a\u821e\u53f0\u63cf\u7ed8\u4e86\u65e5\u97e9\u7537\u5973\u4e4b\u95f4\ u7684\u7231\u60c5\uff0c\u8868\u8fbe\u4e86 [ \u8bed\u8a00\u7684\u9694\u9602\u5e76\u4e0d\u4f1a\u6210\u4e3a\u604b\u7231\u7684\u963b\u788d\uff0c\u62a5\u7740\u60f3\u8981\u4e86\u89e3\u5bf9\u65b9\ u66f4\u591a\u4e00\u70b9\u7684\u4fe1\u5ff5\u53ef\u4ee5\u4e0d\u65ad\u52a0\u6df1\u4e92\u76f8\u7684\u60c5\u611f\u548c\u5173\u7cfb\u3002 ] \u7684\u6982\u5ff5\u3002\u62a5\u544a\u4f1a\u4e0a\u674e\u4fca\u57fa\u7684\u4e00\u53e5 [ \u4f46\u662f\u8981\u901a\u7535\u8bdd\u7684\u8bdd\u5c31\u6bd4\u8f83\u56f0\u96be\u4e86 ] \u9017\u7b11\u4e86\u5bab\u5d0e\u8475\u3002\r\n<P style="TEXT-INDENT: 2em">\u968f\u4f5c\u4e3a\u9676\u5668\u5bb6\u7684\u7236\u4eb2\u8f6c\u5b66\u6765\ u5230\u65e5\u672c\u7684\u97e9\u56fd\u5927\u5b66\u751f\u91d1\u660e(\u674e\u4fca\u57fa\u9970\uff09\u4e00\u76f4\u61d2\u5f97\u5b66\u4e60\u65e5\u8bed\ uff0c\u4e5f\u4e0d\u613f\u610f\u5b66\u4e60\u7236\u4eb2\u7684\u5236\u9676\u6280\u672f\uff0c\u5012\u4e5f\u8fc7\u7740\u6ca1\u6709\u8d1f\u62c5\u7684\ u751f\u6d3b\u3002\u56e0\u4e3a\u9a91\u81ea\u884c\u8f66\u7684\u4e00\u6b21\u5c0f\u5c0f\u610f\u5916\uff08\u4e3a\u4e86\u8eb2\u907f\u5361\u8f66\u548c\ u4e00\u4f4d\u50e7\u4fa3\u649e\u5230\uff0c\u8fd9\u4f4d\u50e7\u4fa3\u5728\u540e\u6765\u8fd8\u4f1a\u591a\u6b21\u51fa\u73b0\uff09\u624b\u8098\u53d7\ u4f24\u800c\u5230\u5bfa\u5e99\u91cc\u6e05\u6d17\uff0c\u521a\u597d\u9047\u89c1\u5728\u90a3\u91cc\u6253\u5de5\u7684\u5973\u5b66\u751f\u4e03\u91cd(\ u5bab\u5d0e\u8475\u9970\uff09\uff0c\u5e76\u5bf9\u5979\u4e00\u89c1\u949f\u60c5\u3002\u4e03\u91cd\u7684\u7236\u4eb2\u6b7b\u4e8e\u8f66\u7978\uff0c\ u6bcd\u4eb2\u56e0\u6b64\u6574\u5929\u6d88\u6c89\uff0c\u5e76\u62db\u60f9\u4e0a\u4e0d\u826f\u5206\u5b50\uff0c\u4e00\u5bb6\u6bcd\u5973\u4e09\u4eba\ u7ecf\u5e38\u6536\u5230\u9a9a\u6270\u3002\u5728\u5bfa\u5e99\u91cc\u660e\u6c42\u5230\u4e00\u652f\u4e0a\u7b7e\uff0c\u5e76\u4e00\u76f4\u5e26\u5728\ u8eab\u8fb9\u3002</P>' 从文件中读到内存里然后输出就不成了呢??
youyou1912 2013-05-21
  • 打赏
  • 举报
回复
引用 7 楼 power0811 的回复:
linux下面输出不行
#include <iostream>
#include <string>
using namespace std;

int main()
{
	setlocale (LC_ALL, "zh_CN.utf8");	
	str = "\u3000\u30001938\u5e743\u67083\u65e5\uff0c\u970d\u514b\u65af\u7684\u300a\u80b2\u5a74\u5947";
	cout << str << endl;
	return 0;
}
power0811 2013-05-20
  • 打赏
  • 举报
回复
 wstringstream ss;
    wstring str;
    ss << "\u3000\u30001938\u5e743\u67083\u65e5\uff0c\u970d\u514b\u65af\u7684\u300a\u80b2\u5a74\u5947";
    getline(ss, str);
    wcout << str << endl;
为什么输出的是: 193833 是什么意思..... linux 环境..
youyou1912 2013-05-20
  • 打赏
  • 举报
回复
引用 2 楼 power0811 的回复:
wchar_test.cpp:39: 错误:聚合‘std::wstringstream ss’类型不完全,无法被定义
头文件 #include <sstream> using namespace std;
power0811 2013-05-20
  • 打赏
  • 举报
回复
不行呀 一样的
赵4老师 2013-05-20
  • 打赏
  • 举报
回复
楼上代码可能需要加:
#include <locale.h>
...
_wsetlocale(LC_ALL,L"chs");
power0811 2013-05-20
  • 打赏
  • 举报
回复
wchar_test.cpp:39: 错误:聚合‘std::wstringstream ss’类型不完全,无法被定义
youyou1912 2013-05-20
  • 打赏
  • 举报
回复
		wstringstream ss;
		wstring str;
		ss << "\u3000\u30001938\u5e743\u67083\u65e5\uff0c\u970d\u514b\u65af\u7684\u300a\u80b2\u5a74\u5947";
		getline(ss, str);
		wcout << str << endl;
JSON自动美化(页面自动检测并格式化) JSON手动美化(粘贴文本、手动格式化) JSON比对工具(支持左右两个JSON片段进行键值对比较) 字符编解码(Unicode/UTF8/Base64/MD5) 代码美化工具(HTML/CSS/JS/XML/SQL) 代码压缩工具(HTML/CSS/JS) 二维码生成器(支持当前页面、图片、链接、选中的文字生成QrCode) 二维码解码器(支持网页二维码右键解码) 简易Postman(Api接口测试,模拟HEAD/GET/POST方式) 网页滚动截屏(将当前整个网页转为图片并保存) Markdown转换(支持Markdown与HTML的互转) 页面取色工具(滑动鼠标随意取色) Js正则表达式(正则测试、常用正则列表) 时间(戳)转换(Unix戳与本地时间的互转) 图片Base64(任意图片转DataURI格式) 随机密码生成(任意字符、任意长度、随机生成) 编码规范检测(HTML/CSS/JS规范检测) 页面性能检测(页面响应时间、Header监测) 页面栅格标尺(页面栅格化、屏幕标尺) 多维小工具集(进制转换、RGB/HEX颜色转换、Crontab、还款计算器等) 网页油猴工具(网页特效、网页定制、脚本注入、自动刷新等) Ajax调试功能(需在控制台中使用) 网页编码设置(UTF-8、GBK、日文、韩文等) 我的便签笔记(便签笔记,支持导出) 人像背景移除(将人物照片中的背景移除:抠图工具)

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧