精华内容
下载资源
问答
  • 保存中文:Unicode编码

    2019-12-05 23:13:35
    编码格式中,中文属于Unicode字符,在内存中占有四字符,英文属于ASCII字符,在内存中只占有两字符。Coolie中使用Unicode字符时需要对Unicode字符进行编码,不然会出现乱码。 在编码和解码时 编码:java.net....

    在编码格式中,中文属于Unicode字符,在内存中占有四个字符,英文属于ASCII字符,在内存中只占有两个字符。Coolie中使用Unicode字符时需要对Unicode字符进行编码,不然会出现乱码。
    在编码和解码时
    编码:java.net.URLEncoder类的encode(String str,String encoding)
    解码:java.net.URLDecoder类的decode(String str,String encoding)
    Cookie中保存中文时只能选择编码,一般使用UTF-8.

    展开全文
  • 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

    万次阅读 多人点赞 2014-02-15 16:46:22
    默认编码:System(简体中文windows系统默认指的是GBK编码,即下拉框选项里的GBK/windows-936-2000/CP936/MS936/windows-936) 二、编码知识科普 Qt常见的两种编码是:UTF-8和GBK ★UTF-8:Unicode Transformat

    尊重作者,支持原创,如需转载,请附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205

    这篇文章有点长,内容有点多,如果时间急迫,可以直接翻页去末尾看结论。红色字体加粗的。(#^.^#)

     

    一、Qt Creator环境设置

    1、cpp或h文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.

    我们使用的Windows系统本地字符集编码为GBK。

    2、Windows环境下,Qt Creator,菜单->工具->选项->文本编辑器->行为->文件编码->默认编码,常用的选项有以下几个:

    System(简体中文windows系统默认指的是GBK编码)

    GBK/windows-936-2000/CP936/MS936/windows-936

    UTF-8

     

    二、编码知识科普

    Qt常见的两种编码是:UTF-8和GBK
    ★UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
    ★GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。GBK是GB2312的扩展,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名。
    ★GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
    GBK、GB2312--Unicode--UTF8
    UTF8--Unicode--GBK、GB2312
    ★在简体中文windows系统下,ANSI编码代表GBK/GB2312编码,ANSI通常使用0x80~0xFF范围的2个字节来表示1个中文字符。0x00~0x7F之间的字符,依旧是1个字节代表1个字符。Unicode(UTF-16)编码则所有字符都用2个字节表示。

     

    三、编码转换

    Windows自带的记事本,无法查看UTF-8编码的文件到底有无BOM,需要使用其他文件编辑器,比如EditPlus或者SublimeText。
    UTF-8与ANSI(即GBK)的互转,可以使用EditPlus工具"文件另存为"或者Encodersoft编码转换工具对.cpp和.h源文件文本进行批量转换.

     

    四、QString显示中文乱码的原因

    我们使用的Windows系统本地字符编码(Local字符集)为GBK。编译器分析出源文件字符编码之后,会进行解码再编码,将源字符集转码成执行字符集。执行字符集一般默认为使用本地字符编码(Local字符集)。

    Qt5可以设置Local字符集,GBK/UTF-8

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");//或者"GBK",不分大小写
    QTextCodec::setCodecForLocale(codec);

    Qt5中QString内部采用unicode字符集,utf-16编码。构造函数QString::QString(const char *str)默认使用fromUtf8(),将str所指的执行字符集从utf-8转码成utf-16。
    由上面fromUtf8()可知,QString需要执行字符集编码为utf-8,然后以utf-8进行解码,再编码为utf-16才能获得正确的字符编码。显示中文乱码的原因其实就是QString转码方式与执行字符集不一致。(比如,源字符集为本地字符集GBK编码,QString以utf-8的方式进行解码,会导致获得错误的二进制编码,再将错误二进制转为utf-16就会出现乱码。)
     

    五、Qt编码指定

    Qt需要在main()函数指定使用的字符编码:

    #include <QTextCodec>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        //设置中文字体  
        a.setFont(QFont("Microsoft Yahei", 9));
    
        //设置中文编码
    #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    #if _MSC_VER
        QTextCodec *codec = QTextCodec::codecForName("GBK");
    #else
        QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    #endif
        QTextCodec::setCodecForLocale(codec);
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
    #else
        QTextCodec *codec = QTextCodec::codecForName("UTF-8");
        QTextCodec::setCodecForLocale(codec);
    #endif
    
        return a.exec();
    }

    这里只列举大家最常用的3个编译器(微软VC++的cl编译器,Mingw中的g++,Linux下的g++),源代码分别采用GBK和无BOM的UTF-8以及有BOM的UTF-8这3种编码进行保存,发生的现象如下表所示。

    情况1:指的是Local字符集为GBK

    情况2:指的是Local字符集为UTF-8

    • 源代码的编码

      编译器

      显示正常

      显示乱码

      GBK

      win vs cl

      情况1

      情况2

      win mingw-g++

      情况1

      情况2

      linux g++

      情况1

      情况2

      UTF-8(无BOM)

      win vs cl

      编译失败

      error C2001: 常量中有换行符

      编译失败
      error C2001: 常量中有换行符

      win mingw-g++

      情况2

      情况1

      linux g++

      情况2

      情况1

      UTF-8(有BOM)

      win vs cl

      情况1

      情况2(有#pragma预处理)

      情况2(没有#pragma预处理)

      win mingw-g++

      情况2

      情况1

      linux g++

      情况2

      情况1
    • 如果您使用的是Visual C++编译器,则默认情况下不会将您的源代码视为utf-8编码。除非有BOM,否则它将使用您当前的代码页进行解释。就是说,当使用Visual C++编译程序的时候,它会分析源文件采用何种编码,有BOM标识符则可以正确识别其编码是UTF-8,若没有BOM标识符则认为其使用本地字符集编码(Local字符集)。Local字符集是什么?取决于你的设置QTextCodec *codec = QTextCodec::codecForName(???);
    • 如果源文件是UTF-8+BOM的编码方式,还需要在头文件加入
    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif

    或者添加QMAKE_CXXFLAGS += /utf-8到您的.pro文件中。

    • 如果源文件是UTF-8+无BOM的编码方式,则一定不能加#pragma execution_character_set(“utf-8”),不然会产生乱码。

     

    六、测试案例

    案例1、中文字符串测试

    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif
    
    #include <QApplication>
    #include <QTextCodec>
    #include <QPushButton>
    #include <QDebug>
    #include <QString>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        //设置中文字体  
        a.setFont(QFont("Microsoft Yahei", 9));
    
        //设置中文编码
    #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    #if _MSC_VER
        QTextCodec *codec = QTextCodec::codecForName("gbk");
    #else
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
    #endif
        QTextCodec::setCodecForLocale(codec);
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
    #else
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
        QTextCodec::setCodecForLocale(codec);
    #endif
    
        QString str(QObject::tr("1中文"));
        qDebug() << str;
        qDebug() << QStringLiteral("2中文");
        qDebug() << QString::fromLatin1("3中文");
        qDebug() << QString::fromLocal8Bit("4中文");
        qDebug() << QString::fromUtf8("5中文");
        qDebug() << QString::fromWCharArray(L"6中文");
    
        return a.exec();
    }

    当QTextCodec::codecForName("utf-8");时,

    QString::fromLocal8Bit和QString::fromUtf8是等效的。

    当QTextCodec::codecForName("gbk");时,

    QString::fromLocal8Bit和QString::fromUtf8是不等效的。

    案例2、QCom跨平台串口调试助手(http://www.qter.org/?page_id=203)
    源代码qcom\mainwindow.cpp,aboutdialog.cpp等文件用的是UTF-8编码(无BOM);但是qcom\qextserial\*.*文件用的是ANSI编码.在linux环境编译完全OK.
    笔者Windows环境的Qt Creator+微软VC++编译器,环境设置用的是ANSI(即GBK)编码.编译源文件会报错.
    错误提示"fatal error C1018: 意外的 #elif".


    解决方法由两种:

    方法1:

    把qcom\的所有cpp和h文件都用工具转换成ANSI编码,main()函数使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

    方法2:

    先把Qt Creator环境设置用的是UTF-8编码,

    再把qcom\的所有cpp和h文件都用工具转换成UTF-8+BOM编码,请注意,如果文件转换成UTF-8(无BOM),编译仍会失败.main()函数使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));//注意,此处仍是"GBK",不是"UTF-8"
    重新编译,OK!

    其它:

     

    七、结论

    Windows环境下,Qt Creator+微软VC++编译器,新建工程,

    1、如果该工程不需要跨平台使用(只在win),那么工程设置请使用GBK的编码方式.

    2、如果该工程要跨平台使用(win+linux),那么工程设置请使用UTF-8+BOM的编码方式.

    另外,还需要在预编译头文件加入

    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif

    或者添加QMAKE_CXXFLAGS += /utf-8到您的.pro文件中。

    3、Linux环境下,Qt Creator+gcc,新建工程,

    没有GBK编码可选,默认是UTF-8(无BOM)编码方式,考虑到跨平台,建议选择UTF-8+BOM的编码方式.

     

    ★★★★★★★★★★★★★★★综上所述,解决乱码的方法概括如下:★★★★★★★★★★★★★★★★★★★★★

    1、如果IDE是Qt Creator,把它的环境设置为“UTF-8+BOM”编码。

    2、如果IDE是Visual Studio,请下载插件,名称是ForceUTF8 (with BOM),所有源文件和头文件都会保存为“UTF-8+BOM”编码。

    3、如果编译器是MSVC,请在预编译头stdafx.h文件加入

    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif

    4、源码文件main函数入口设置中文编码:

        #include <QTextCodec>

        QApplication a(argc, argv);

        //设置中文字体  
        a.setFont(QFont("Microsoft Yahei", 9));

    //设置中文编码
    #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    #if _MSC_VER
        QTextCodec *codec = QTextCodec::codecForName("gbk");
    #else
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
    #endif
        QTextCodec::setCodecForLocale(codec);
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
    #else
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
        QTextCodec::setCodecForLocale(codec);
    #endif

    5、如此一来,不管是MSVC编译器还是MinGW编译器,都能编译通过,且支持中文!

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

     

    x、参考文献

    Qt官网文档 

    https://wiki.qt.io/Strings_and_encodings_in_Qt

    https://doc.qt.io/qt-5/unicode.html

    ASCII,Unicode和UTF-8完全搞清楚 https://blog.csdn.net/Deft_MKJing/article/details/79460485

    Qt中文乱码原因及解决方案 https://blog.csdn.net/qq_35905572/article/details/95042444

    Qt中文乱码问题 http://blog.csdn.net/brave_heart_lxl/article/details/7186631

    尊重作者,支持原创,如需转载,请附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205

     

     

    展开全文
  • Created by Wang, Jerry, last modified on Sep 25, 2015 记事本里以ASCII保存: UTF8: 使用3字节保存。...big5转化失败:( 从第张图的表也能看出,该汉字不存在big5编码) Java程序: Str...

    Created by Wang, Jerry, last modified on Sep 25, 2015

    clipboard1
    clipboard2
    记事本里以ASCII保存:
    clipboard3
    UTF8: 使用3个字节保存。(只有其他极少使用的Unicode辅助平面的字符使用四字节编码)
    clipboard4
    UTF16 ( big endian ) :
    clipboard5
    GBK:
    clipboard6
    big5转化失败:( 从第一张图的表也能看出,该汉字不存在big5编码)
    clipboard7
    clipboard8
    Java程序:

    String shang = "殇";
    System.out.println(shang);
    try {
    String result = URLEncoder.encode(shang, "UTF-8");
    System.out.println(result);
    } catch (UnsupportedEncodingException e) {
    
    e.printStackTrace();
    }
    

    clipboard9
    clipboard10

    展开全文
  • 分析:windows下cmd默认的...方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view plain copy title = textVar.get() + ".txt" # 获取标题  con

    分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK

    方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件

    如下

    [python]  view plain  copy
    1. title = textVar.get() + ".txt"              # 获取标题  
    2. content = text.get("0.0""end")            # 获取内容  
    3.   
    4. if title != ".txt":  
    5.     fileObj = open(title, "wb")             # 打开一个文件  
    6.     if systemName == "nt":  
    7.         print u"Windows系统";  
    8.         fileObj.write(content.encode("gbk"));  
    9.     else:  
    10.         print u"Linux系统";  
    11.         fileObj.write(content);  
    12.     fileObj.close()                         # 关闭打开的文件  
    13.     label.config(text = "已保存")   
    14. else:  
    15.     label.config(text = "请输入标题")   

    os.name判断是windows系统还是Linux系统


    解决中文乱码

    写的时候

    [python]  view plain  copy
    1. content.encode("gbk")  

    读取的时候同样要以gbk解码

    [python]  view plain  copy
    1. content.decode("gbk")  

    方法二:直接设置cmd的编码为UTF-8或者gbk 后面直接就可以读写了

    [python]  view plain  copy
    1. import sys    
    2. reload(sys)    
    3. sys.setdefaultencoding('utf-8')  
    4. print sys.getdefaultencoding()   
    展开全文
  • 开始之前先讲一下汉字编码到底是啥? 汉字编码就是汉字对应于计算机中的编码存储,主要有以下几种常见的汉字字符集编码: GB2312编码:1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码...
  • json文件保存后,汉字显示为unicode编码 with open('./qdict.json','w') as f: json.dump(qdict, f) 保存中文显示为: {"": 0, "\u7814": 1, "\u7a76": 2, "\u53d1": 3, "\u73b0": 4, "\u7ec6": 5, "\u80de": 6}...
  • 中文汉字计算机编码

    千次阅读 2016-07-11 17:37:58
    很久很久以前,有群人,他们决定8可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8开关状态是好的,于是他们把这称为”字节“。再后来,他们又做了一些可以处理这些字节的机器,机器开动...
  • Servlet --cookie编码保存中文信息

    千次阅读 2017-08-07 18:13:41
    Servlet --cookie保存中文信息 ...2、可以使用url编码和解码方式,解决cookie不能保存中文的问题。 二、实例 1、使用url进行编码和解码 package test09_2Servlet; import java.io.IOException; import java.i
  • 汉字由于数量太多,其编码范围远远超过一个字节的取值范围,所以汉字的存储是两个字节保存的。 在 Java 中,使用Unicode字符集对字符进行编码,可以存储65535个字符。 Java中的字符类型被定义为两个字节,所以可以...
  • 查了一些资料(参考百度),做出实际应用,该应用是由C语言实现,压缩包里是一个codeblock工程文件夹,在debug有exe文件。打开后是个黑盒,输入你要输入的中文,然后会自动将十六进制编码保存在剪切板,再粘贴即可。
  • 遇到一个问题:使用scrapy crawl执行爬虫程序并导入一个json文件,此时可以看到,命令行窗口显示的保存内容是中文,但在打开导出的json文件时,其内容却显示为以\u开头的Unicode编码: 之后查询相关资料后,发现有...
  • 完美解决MySQL保存中文出现字符集编码问题1366错误 1.最近在使用sqlalchemy将中文存放至mysql数据库的表中时出现: Warning Code :1366 Incorrect string value: ‘\xE5\x9C\xA8’ for column ‘content’ at ...
  • 汉字编码

    2018-12-09 18:41:05
    最近工作遇到汉字gb2312转utf-8编码的问题,这种问题以前也遇到过几次,每次遇到都是感觉模模糊糊,似懂非懂,故这次写博客好好总结下。  、为什么需要编码  我们都知道计算机采用的是二进制值,我们电脑上的...
  • JAVA输出流写文件时,即使指定编码为UTF-8,如果保存内容里面没有中文,文件编码格式会自己转成ANSI格式这让很多程序员很头痛, public static void saveFile(String file, String data, boolean append) throws ...
  • 在查找 UTF-8 编码资料时发现,很多的帖子说的 UTF-8 编码里,一个汉字占用3个字节,有的还做了个证明,大概是这样的,创建一个没有BOM的UTF-8编码的文本文件,里面保存了几个汉字,然后查看文件的大小。我觉得这样...
  • 最近发现Oracle和MySQL的字段长度的计算不一样(都是UTF8编码),比如: 在Oracle下定义:name varchar2(10) ,name字段能存放:10字符或3个汉字 在MySQL下定义:name varchar(10),name字段能存放:10字符或10...
  • Qt中文乱码以及汉字编码

    千次阅读 2020-03-28 17:59:25
    一、背景介绍 1.Unicode是一个编码方案 Unicode 是为了解决传统的字符编码方案的...utf8 占用一到四个字节,英文一个字节,中文三个字节 utf-16占用二或四个字节 utf-32占用四个字节 二、Qt 字符显示异常 在Qt crea...
  • Eclipse编码格式修改 保存中文问题

    千次阅读 2008-10-25 09:51:00
    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码。然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简体中文操作系统 (Windows XP、...
  • eclipse 由于开源所以支持了比较杂的编码方式,而这些一个工程导入时添加了不少的外来程序,由于不是同一工程一次编码带来了其中含有 GBK 或 UTF8 或 UTF16 或 ASCII 等文件编译时就会出现错误警告。 UTF-8:...
  • [img=https://img-bbs.csdn.net/upload/201707/27/1501130047_310424.png][/img] 像这种数据 显示时是中文名称,但是保存的时候要显示编码? 还有我查看的时候怎么绑定回来???
  • cookie中保存中文的时候,在前台获取时经常回出现乱码问题,以.NET开发为例,在保存cookie的时候进行编码 Cookies[“cookiename”].Value = System.Web.HttpUtility.UrlEncode(strValue,Encoding.UTF8); /*  ...
  • 1. Python 3已经将unicode作为默认编码 2. Python 3中的json在做dumps操作时,会将中文转换成unicode编码,并以16进制方式存储,再做...json dump有一个ensure_ascii参数,当它为True的时候,所有非ASCII码字符显...
  • gbk汉字编码拼音对照表21004字全

    热门讨论 2016-01-27 18:38:10
    包含所有GBK编码的21004个汉字的汉语拼音对照表有声调,从网上搜集的都不全,自己先从网上搜集资料然后手动差补全的,可导入数据库
  • CString strkey = "测试";DWORD dBufSize = WideCharToMultiByte(CP_UTF8, 0, strkey, -1, NULL, 0, NULL, FALSE);//分配目标缓存 char *dBuf = new char[dBufSize]; memset(dBuf, 0, dBufSize);...
  • 汉字编码问题

    2013-08-02 18:11:32
    在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset)。  在最初的时候,Internet上只有一种字符集——ANSI的...
  • mysql 中utf8编码存放中文汉字问题

    千次阅读 2016-10-17 14:28:08
    今天对mysql数据库进行操作时,发现始终存不进数据库,搞了很久才发现这张表字符长度为VARCHAR(20),而我存入的汉字超过了7个!...一个汉字占多少长度与编码有关:  UTF-8:一个汉字=3个字节  GBK:一
  • 字符编码和字符编码保存格式

    千次阅读 2006-03-15 18:04:00
    utf16和utf8是UNICODE编码保存格式3,utf16就是所有unicode编码16bit存储4,utf8是压缩的,例如在unicode里ASCII字符部分的编码和ASCII的编码是一样的0-127,在utf8里就8bit来存储,那些汉字双字节...
  • https://blog.csdn.net/shi553210541/article/details/48524285
  • 在eclipse或者myeclipse编辑属性文件时候,常常遇到文件内容出现中文字体而被提示出不可以保存的错误。 解决办法:通过右击该文件,修改该文件的编码格式为UTF-8即可。  但是常常出现的情况是修改...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 191,226
精华内容 76,490
关键字:

保存一个汉字用的编码