V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
liuguangxuan
V2EX  ›  程序员

请教各位老哥,有没有讲字符编码与字符集的书籍推荐?

  •  
  •   liuguangxuan · 2023-09-27 14:38:48 +08:00 · 2135 次点击
    这是一个创建于 457 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有关字符编码和字符集的概念,一直是云里雾里的,虽然知道一些 Ascii 、Unicode 、UTF-8 、GBK 、单字节、多字节、宽字符、char 、wchar_t 、string 、wstring 等知识,但是并不能完全将他们串起来,特别是涉及到他们之间进行转换的时候,一旦在项目中,碰到乱码的问题,就觉得无从下手。

    请各位有经验的老哥推荐一些这方面的书籍。如果书中有 C/C++示例就更棒了。

    36 条回复    2023-10-07 10:47:57 +08:00
    IsuYww83LvR48EaC
        1
    IsuYww83LvR48EaC  
       2023-09-27 15:06:39 +08:00
    《编码》?
    Noicdi
        3
    Noicdi  
       2023-09-27 15:09:37 +08:00 via iPhone   ❤️ 2
    AlanStar
        4
    AlanStar  
       2023-09-27 17:22:04 +08:00
    你在国内做东西的话知道 UTF-8 ,GBK 什么的就够了,不用知道太多,字符编码这个东西本质上就是用一套编码体系来映射文字和符号。
    看 OP 的描述应该是做 C/CPP 开发的,我是做嵌入式开发的,建议你还是能不用中文输出就不用,对嵌入式设备来说输出中文有点浪费资源,print 也就是提示使用者程序的运行进度而已,也不必要必须是中文。

    如果你必须这么做的话,有几个建议:
    1.你可以用支持 Unicode 字符集的编译器(GCC/Clang)之类,但是需要在编译过程中加选项才可以。
    2.可以在对应文件首部添加 // -*- coding: utf-8 -*- 来声明文件使用 UTF-8 编码。
    3.也有在运行前在终端上执行 chcp 65001 这个命令的,我自己有试过但是好像不太尽人意。
    4.可以引入宽字符集<wchar.h>,这条在网上搜到的,我没用过,OP 可以自己查查。
    hxy2856
        6
    hxy2856  
       2023-09-27 17:26:13 +08:00
    @AlanStar 老哥 插个楼问一问 嵌入式最近是不是需求量很大?什么原因啊,我看 8 月份招聘量挺高的 https://www.jobui.com/trends/quanguo-qianrushi/
    AlanStar
        7
    AlanStar  
       2023-09-27 17:31:47 +08:00
    @hxy2856 这个我还真不太清楚,我觉得应该是和国家宏观战略有关,做芯片搭边的产业可能会有额外补贴。
    AlanStar
        8
    AlanStar  
       2023-09-27 17:34:35 +08:00
    @hxy2856 我现在在做大数据开发,主要是学校不好我现在实习都不敢找嵌入式这种起点高的。
    Jakarta
        9
    Jakarta  
       2023-09-27 17:34:44 +08:00 via Android
    @Noicdi #2 我的收藏夹里也是这篇文章😂
    iOCZ
        10
    iOCZ  
       2023-09-27 17:35:06 +08:00   ❤️ 1
    字符集是一个字符对应哪个整数,编码是怎么存这个整数,这个整数可能会很大,需要多个字节来存。说白了,就这么回事。https://liyucang-git.github.io/2019/06/17/%E5%BD%BB%E5%BA%95%E5%BC%84%E6%87%82Unicode%E7%BC%96%E7%A0%81/
    ysc3839
        11
    ysc3839  
       2023-09-27 17:48:05 +08:00 via Android
    字符集:ASCII Unicode GBK(没看过标准文档,不确定 GBK 是不是字符集和编码一起规定了)
    因为目前绝大多数计算机内部存储、处理的是二进制数值,所以要给不同的字符编上序号,所有编好号的字符组成字符集。
    字符编码(字符对应的整数在计算机内的二进制编码方案):UTF-8 UTF-16 GBK 7bitASCII
    计算机处理二进制数据时是有一定限制的,比如有位长度限制(16bit, 32bit 等),有存储器最小访问长度限制(byte bits ,单字节位长度,目前主流计算机是 8bit),所以要根据不同限制,把字符序号转换成计算机能处理的数据。比如 7bit ASCII 是用于 byte bits>=7 的计算机,一个字符使用且最多使用一个字节,属于单字符单字节的编码方案。UTF-8 则是单字符多字节。
    char:应该是 C/C++语言的概念,是一个主要用于表示字符的整数类型,一般来说长度是 1 字节。
    宽字符、wide char 、wchar_t:应该也是 C/C++语言的概念,一般是能存储 Unicode 字符的整数类型,一般来说长度是 2 或 4 字节。
    hxy2856
        12
    hxy2856  
       2023-09-27 17:51:08 +08:00
    @AlanStar 感谢~ 猜是政策问题
    liuguangxuan
        13
    liuguangxuan  
    OP
       2023-09-27 19:47:06 +08:00 via Android
    @jiaqizhang 感谢老哥推荐好书,收藏了。
    大致看了一下目录,感觉这本应该偏计算机组成原理。
    iX8NEGGn
        14
    iX8NEGGn  
       2023-09-27 19:58:45 +08:00   ❤️ 1
    正打算写,从 19 年到现在,我看了上千个网页,几十本包括 Unicode 、ISO/IEC 、中国的 GB 系列在内的 PDF 文档,写了二十多万字的笔记,正在重新整理安排如何由浅入深的介绍。

    看得越多越发现我可能永远也学不会字符编码了,因为要精通全世界各国语言才能明白它为什么这么设计,以及一些早期的文档已经找不到,但我还是有很大的把握能写出一篇全网讲得较为明白的长文或书。

    顺便问下,由于有的地方需要一些佐证,有没有好心人能借用 ISO/IEC 会员,我想把历年来所有 ISO/IEC 字符编码标准下载下来。
    xmuli
        15
    xmuli  
       2023-09-27 23:28:30 +08:00   ❤️ 1
    此两篇应该足够,① 详细讨论分析,②工作快速对照。
    从起因分析,到 C++ 在 MSVC / MinGW 下的代码验证。甚是符合题主的提问。

    ①极繁根因分析 --> 愿编程不再乱码(含 Qt)-根因深究 [★★★★★] https://ifmet.cn/posts/c0862e62

    ②极简图表解释 --> 古文码、口字码、符号码、问号码、棍拷码 [★★★★★]
    https://blog.csdn.net/qq_33154343/article/details/99617767

    且若是额外有兴趣可看 Github QtExamples 的第六章
    dandycheung
        16
    dandycheung  
       2023-09-28 00:00:05 +08:00 via Android
    好多好多年前,有一篇《字节那些事儿》: https://blog.csdn.net/dandycheung/article/details/5881620
    cnbatch
        17
    cnbatch  
       2023-09-28 01:15:51 +08:00   ❤️ 1
    自己手动转换基本上不可能,等于重新造一个 ICU (International Components for Unicode),不如直接调库吧
    12345tiger
        18
    12345tiger  
       2023-09-28 02:16:23 +08:00 via Android
    @hxy2856 可能是国产仪器需求带动的。现在大力提倡科学仪器国产化,从几十块的小设备到几百上千万的核磁、质谱,所有都优先采购国产,这需求不就一下子出来了吗
    hxy2856
        19
    hxy2856  
       2023-09-28 08:51:14 +08:00
    @12345tiger 应该就是这个原因
    vaaagle
        20
    vaaagle  
       2023-09-28 09:32:10 +08:00
    SmiteChow
        21
    SmiteChow  
       2023-09-28 10:37:13 +08:00
    其实就是两个概念,理解了就没什么了。
    hxysnail
        22
    hxysnail  
       2023-09-28 11:05:01 +08:00   ❤️ 1
    我之前写过一篇博客,可以参考一下: https://fasionchan.com/posts/coding/
    koebehshian
        23
    koebehshian  
       2023-09-28 11:05:07 +08:00
    维基百科看看就行了,配合 hexdump 一下
    Feedmo
        24
    Feedmo  
       2023-09-28 12:26:30 +08:00
    unicode explained
    karott7
        25
    karott7  
       2023-09-28 13:30:35 +08:00
    直接维基百科看
    yelog
        26
    yelog  
       2023-09-28 13:46:22 +08:00   ❤️ 1
    weeei
        27
    weeei  
       2023-09-30 17:14:47 +08:00
    如果是 Windows 使用 VS 开发,需要注意,源文件使用的编码是跟随当前操作系统的,比如你用简体中文版本,源文件里面的字符串字面量就是 GB1080 ,如果用了繁体字面量在台湾版本的 Windows 下显示是不正常的,这里的原因就需要继续了解文字编码和语言字体的关系了。
    weeei
        28
    weeei  
       2023-09-30 17:17:19 +08:00   ❤️ 1
    另外 UTF-8 、UTF-16 和 UTF-32 不是 32 > 16 > 8 的关系,UTF-16 是个有缺陷的编码方式,不能表示全部字符集。只有 UTF-8 和 UTF-32 可以。只要记住结论 UTF-8 最牛逼就行了。
    liuguangxuan
        29
    liuguangxuan  
    OP
       2023-10-06 15:05:29 +08:00
    @Feedmo #24 请问一下老哥,《 Unicode Explained 》这本书有中文版吗?
    liuguangxuan
        30
    liuguangxuan  
    OP
       2023-10-06 15:23:58 +08:00
    @dandycheung #16 感谢老哥,这篇博文主要讲述的是字节,我想了解的是编码。不过还是谢谢~
    liuguangxuan
        31
    liuguangxuan  
    OP
       2023-10-06 15:44:21 +08:00
    @xmuli #15 老哥,你给推荐的博文特别棒,正是我所需要的,非常感谢老哥。
    还有此类高质量的博文吗?麻烦再给推荐一些吧,如果有此方面的书籍,就更棒啦~
    liuguangxuan
        32
    liuguangxuan  
    OP
       2023-10-06 16:03:42 +08:00
    @iX8NEGGn #14 老哥写了之后麻烦通知一下啊,等着拜读您的著作。
    另外可否推荐几篇您读过的一些高质量的博文?如果有这方面的书籍就更棒啦~
    liuguangxuan
        33
    liuguangxuan  
    OP
       2023-10-06 21:12:31 +08:00
    @Noicdi #3 感谢老哥推荐的好文章,都一一看完了。老哥还有推荐的类似的高质量文章吗?书籍也可以哈。
    xmuli
        34
    xmuli  
       2023-10-06 22:25:59 +08:00
    @liuguangxuan https://github.com/XMuli/QtExamples 乱码和编码部分属于第六章; 部分写的比较早期,希望可以帮助到你
    Noicdi
        35
    Noicdi  
       2023-10-07 05:44:18 +08:00   ❤️ 1
    @liuguangxuan #33 我当时也是工作上碰到了字符编码相关的问题,找到了这两篇文章大概看了一下,手上也没有类似的文章了。但是感觉可以在楼主的评论区里学到好多啊哈哈哈。感谢楼主的问题和各位老哥的回复。
    Feedmo
        36
    Feedmo  
       2023-10-07 10:47:57 +08:00
    @liuguangxuan 中文版我没找着,技术书的英文大多都没那么难读懂的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5270 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 09:30 · PVG 17:30 · LAX 01:30 · JFK 04:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.