【问题标题】:Where can I get started with Unicode-friendly programming in C?我在哪里可以开始使用 C 中的 Unicode 友好编程?
【发布时间】:2011-01-15 00:39:59
【问题描述】:

所以,我正在做一个纯 C (ANSI 9899:1999) 项目,并试图找出从哪里开始:Unicode、UTF-8 和所有爵士乐。

具体来说,它是一个语言解释器项目,我需要在两个主要地方处理 Unicode:读取源文件(该语言表面上支持 Unicode 标识符等),以及“字符串”对象。

我熟悉有关 Unicode、UTF-7/8/16/32 和 UCS-2/4 等等的所有显而易见的基础知识……我主要在寻找有用的、特定于 C 的(即是,请不要使用 C++ 或 C#,这是之前在 SO 上记录的所有内容)资源,关于我在 C 中实现 Unicode 友好的东西的“下一步”。

非常欢迎任何链接、手册页、维基百科文章、示例代码。我还将尝试在原始问题中保留此类资源的列表,以供以后遇到它的任何人使用。


【问题讨论】:

  • +1 为 iconv,只要它可用。在 windows icu 上可能是更好的选择

标签: c string unicode encoding unicode-string


【解决方案1】:

International Components for Unicode 提供了一个可移植的 C 库来处理 unicode。这是他们对 ICU4C 的电梯宣传:

C 和 C++ 语言以及许多操作系统环境不完全支持 Unicode 和符合标准的文本处理服务。即使某些平台确实提供了良好的 Unicode 文本处理服务,可移植应用程序代码也无法使用它们。 ICU4C 库填补了这一空白。 ICU4C 为应用程序提供了一个开放、灵活、可移植的基础,用于满足其软件全球化需求。 ICU4C 密切跟踪行业标准,包括 Unicode 和 CLDR(通用区域设置数据存储库)。

【讨论】:

  • 我听说过(我认为 Joel 在我添加到第一篇文章的链接中提到了它)……我不敢碰任何东西 IBM,但他们似乎倾向于单体软件。我更多的是在寻找 stdlib-C 的东西、技巧等,而不是库……我试图让我的依赖关系对于这个项目来说真的很轻。也就是说,我会将它们添加到原始帖子中,它们可能对其他人有用。 ICU有多重?也许如果它们真的很轻/简单,那值得我花时间……
  • ICU 是 Unicode 处理中的非 Microsoft 行业标准 -- 无需听说。虽然学习曲线很陡峭。顺便说一句——如果您只对正确传输和表示 Unicode 感兴趣,而不需要 ICU。 ICU 是关于使用 Unicode。
  • 具体来说,我认为在这个特定的时刻,我需要做的最低限度是读入(至少)UTF-8/ASCII 文件,并将它们转换为内部的、标记化的 UTF-32 “字符串”表示。我可以轻松(-ish)做到这一点没有重症监护室,或者更轻的东西?
  • @elliottcable:如果这就是你想要做的,你只需要一个 UTF-8 解码器,它可以很容易地从头开始编写;我在 stackoverflow 上已经有一个验证器(stackoverflow.com/questions/1031645/…)和一个编码器(stackoverflow.com/questions/1082162/how-to-unescape-html-in-c/…,函数putc_utf8()),编写它们很简单
  • 是的,我也猜到了。但是,问题仍然存在;我仍在寻找更有用的 Unicode 资源,不仅是为了我自己,也是为了其他人。 (-:
【解决方案2】:

GLib 有一些 Unicode functions 并且是一个非常轻量级的库。它与 ICU 提供的功能级别不同,但对于某些应用程序来说可能已经足够了。 GLib 的其他特性也适用于可移植的 C 程序。

GTK+ 建立在 GLib 之上。 GLib 提供了在应用程序中经常重复的基本算法语言结构。该库具有以下功能(此列表不是完整列表):

  • 对象和类型系统
  • 主循环
  • 动态加载模块(即插件)
  • 线程支持
  • 定时器支持
  • 内存分配器
  • 线程队列(同步和异步)
  • 列表(单链接、双链接、双端)
  • 哈希表
  • 数组
  • 树(N 元和二元平衡)
  • 字符串实用程序和字符集处理
  • 词法扫描器和 XML 解析器
  • Base64(编码和解码)

【讨论】:

    【解决方案3】:

    我认为有趣的问题之一是 - 字符串的规范内部格式应该是什么?两个明显的选择(至少对我而言)是

    a) 普通 c 字符串中的 utf8 b) 无符号短数组中的 utf16

    在之前的项目中,我一直选择 utf-8。为什么 ;因为它是 C 世界中阻力最小的路径。您与之交互的所有内容(stdio、string.h 等)都可以正常工作。

    接下来是什么文件格式。这里的问题是它对您的用户可见(除非您为您的语言提供唯一的编辑器)。在这里我猜你必须拿他们给你的东西并尝试通过窥视来猜测(字节顺序标记帮助)

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 2023-03-26
      • 2011-02-24
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多