gpt4 book ai didi

c - 跨平台 C 应用程序的 UTF8 支持

转载 作者:太空狗 更新时间:2023-10-29 15:16:57 25 4
gpt4 key购买 nike

我正在开发一个必须处理 UTF8 文本的跨平台 C(C89 标准)应用程序。我只需要基本的字符串操作函数,如 substrfirstlast 等。

问题一

有没有实现上述功能的UTF8库?我已经研究过 ICU,它对我的​​要求来说太大了。我只需要支持 UTF8。

我找到了一个 UTF8 解码器 here .以下函数原型(prototype)来自该代码。

void utf8_decode_init(char p[], int length);

int utf8_decode_next();

初始化函数采用字符数组,但 utf8_decode_next() 返回 int。这是为什么?如何使用 printf 等标准函数打印此函数返回的字符?该函数正在处理字符数据,如何将其分配给整数?

如果上面的解码器不适合生产代码,你有更好的推荐吗?

问题二

阅读文章时我也感到困惑,因为您需要使用 wchar_t 来获得 unicode。据我了解,这不是必需的,因为普通的 C 字符串可以保存 UTF8 值。我通过查看 SQLite 和 git 的源代码验证了这一点。 SQLite 具有以下类型定义。

typedef unsigned char u8

我的理解对吗?还有为什么需要 unsigned char

最佳答案

  1. utf_decode_next()函数返回下一个 Unicode 代码点。由于 Unicode 是 21 位字符集,因此它不能返回小于 int 的任何内容。 ,并且可以说从技术上讲,它应该是一个 long自从 int可以是 16 位数量。实际上,该函数会返回一个 UTF-32 字符。

    您需要查看 C89 的 C94 宽字符扩展以打印宽字符( wprintf()<wctype.h><wchar.h> )。但是,单独的宽字符并不能保证是 UTF-8 甚至 Unicode。您很可能无法打印 utf8_decode_next() 中的字符便携,但这取决于您的便携性要求是什么。您必须移植到的系统范围越广,所有系统都能简单工作的可能性就越小。在您可以编写可移植的 UTF-8 的范围内,您可以将 UTF-8 字符串(不是从 utf8_decode_next() 获得的 UTF-32 字符数组)发送到常规打印函数之一。 UTF-8 的优势之一是它可以被大部分不了解它的代码操纵。

  2. 你需要明白一个 4 字节的 wchar_t可以在单个单元中保存任何 Unicode 代码点,但是 UTF-8 可能需要 1 到 4 个 8 位字节(1-4 个存储单元)来保存单个 Unicode 代码点。在某些系统上,我相信 wchar_t可以是 16 位 ( short ) 整数。在这种情况下,您被迫使用 UTF-16,它使用两个存储单元和代理对基本多语言平面(BMP,代码点 U+0000 .. U+FFFF)之外的 Unicode 代码点进行编码。

    使用 unsigned char让生活更轻松;普通 char经常被签到。负数让生活变得比我需要的更困难(而且,相信我,这已经足够困难而不增加复杂性)。

关于c - 跨平台 C 应用程序的 UTF8 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4501621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com