标签: utf-32

哪些开源C或C++库可以将任意UTF-32转换为NFC?

哪些开源C或C++库可以将任意UTF-32转换为NFC

我认为到目前为止可以做到这一点的图书馆:ICU,Qt,GLib(不确定?).

我不需要任何其他复杂的Unicode支持; 只是从任意但已知正确的UTF-32转换为NFC形式的UTF-32 .

我最感兴趣的是一个可以直接执行此操作的库.例如,Qt和ICU(据我所知)都通过与UTF-16之间的中间转换阶段完成所有工作.

c++ unicode open-source utf-32

7
推荐指数
1
解决办法
714
查看次数

在 C++17/C++20 中从 wstring 到 u16string 并返回(符合标准)的转换

我的主要平台是 Windows,这就是我在内部使用 UTF-16(主要是 BMP 字符串)的原因。我想对这些字符串使用控制台输出。

不幸的是没有std::u16coutstd::u8cout,所以我需要使用std::wcout。因此,我必须将 u16strings 转换为 wstrings - 最好(也是最简单)的方法是什么?

在 Windows 上,我知道 wstring 指向 UTF16 数据,因此我可以创建一个简单的 std::u16string_view 使用相同的数据(无转换)。但是在 Linux 上 wstring 通常是 UTF32 ......有没有办法在没有宏和假设 sizeof(wchar_t) == 2 => utf16 的情况下做到这一点?

c++ utf-16 wstring utf-32 c++17

7
推荐指数
1
解决办法
273
查看次数

std::wstring 在 Windows 上支持 UTF-16 和 UTF-32 吗?

我正在学习 Unicode,并有几个问题希望得到解答。

1)我读到,在 Linux 上,std::wstring是 4 字节,而在 Windows 上,它是 2 字节。这是否意味着 Linux 内部支持UTF-32而 Windows 内部支持UTF-16

2) std::wstring 的使用与 std::string 接口非常相似吗?

3) VC++ 是否支持使用 4 字节 std::wstring?

4)如果使用std::wstring,是否必须更改编译器选项?

作为旁注,我遇到了一个用于处理 UTF-8 的字符串库,它具有与 std::string 非常相似的接口,它提供了熟悉的功能,例如长度、substr、查找、大小写转换等。该库是Glib ::ustring

请随时添加任何评论或其他建议,因为我真的需要它。

谢谢你!

c++ unicode utf-8 utf-16 utf-32

6
推荐指数
2
解决办法
6746
查看次数

在C#中没有UTF-32大端?

在C#中,Encoding.UTF32是UTF-32 little-endian,Encoding.BigEndianUnicode是UTF-16 big-endian,Encoding.Unicode是UTF-16 little-endian.但我找不到UTF-32大端的任何东西.

我正在开发一个简单的textviewer,并且不认为有很多文档用UTF-32大端编码,但我也想为此做好准备,以防万一.

C#不支持UTF32大端吗?

BTW Java支持它.

c# encoding text endianness utf-32

6
推荐指数
1
解决办法
747
查看次数

使用C/C++转义unicode字符

我需要将输入字符串中的unicode字符转义为UTF-16或UTF-32转义序列.例如,输入字符串文字"Eat, drink, ?"应该转义为"Eat, drink, \u611b".以下是各种表格中的规则:

逃生 | Unicode代码点


'\ u'HEX HEX HEX HEX | Unicode代码点,范围为U + 0到U + FFFF,包括与编码的十六进制值对应的范围.


'\''HEX HEX HEX HEX HEX HEX HEX HEX HEX Unicode代码点,范围为U + 0到U + 10FFFF,包括与编码的十六进制对应的范围.


一般来说检测Unicode字符很简单,因为如果ASCII,第二个字节为0:

L"a" = 97, 0
Run Code Online (Sandbox Code Playgroud)

,不会被逃脱.使用Unicode字符时,第二个字节永远不会为0:

L"?" = 27, 97
Run Code Online (Sandbox Code Playgroud)

,作为逃脱\u611b.但是,我如何检测UTF-32字符串,因为它的转义与UTF-16的转义不同,带有8个十六进制数字?

它不像检查字符串的大小那么简单,因为UTF-16字符是多字节的,例如:

L"????" = 42, 9, 77, 9, 48, 9, 71, 9
Run Code Online (Sandbox Code Playgroud)

我的任务是逃避未转义的输入字符串文字Eat, drink, ?,并以转义的文字形式将它们存储到磁盘Eat, drink, \u611b(UTF-16示例)如果我的程序找到UTF-32字符,它应该在表单中转义它们\U8902611b(UTF-32示例) ,但我找不到某种方式知道我是否在输入字节数组中处理UTF-16或UTF-32.那么,我怎样才能在wchar_t字符串或字节数组中可靠地区分UTF-32和UTF-16字符?

c++ unicode utf-16 utf-32

5
推荐指数
1
解决办法
6453
查看次数

如何检测终端中的unicode字符串宽度?

我正在开发一个基于终端的程序,它具有unicode支持.在某些情况下,我需要确定字符串在打印之前将消耗多少个终端列.不幸的是,有些字符是2列宽(中文等),但我发现这个答案表明检测全角字符的好方法是从ICU库调用u_getIntPropertyValue().

现在我正在尝试解析我的UTF8字符串的字符并将它们传递给此函数.我现在遇到的问题是u_getIntPropertyValue()需要一个UTF-32代码点.

从utf8字符串获取此信息的最佳方法是什么?我目前正在尝试使用boost :: locale(在我的程序中的其他位置使用),但是我无法获得干净的转换.来自boost :: locale的我的UTF32字符串预先设置了零宽度字符以指示字节顺序.显然我可以跳过字符串的前四个字节,但有更简洁的方法吗?

这是我目前丑陋的解决方案:

inline size_t utf8PrintableSize(const std::string &str, std::locale loc)
{
    namespace ba = boost::locale::boundary;
    ba::ssegment_index map(ba::character, str.begin(), str.end(), loc);
    size_t widthCount = 0;
    for (ba::ssegment_index::iterator it = map.begin(); it != map.end(); ++it)
    {
        ++widthCount;
        std::string utf32Char = boost::locale::conv::from_utf(it->str(), std::string("utf-32"));

        UChar32 utf32Codepoint = 0;
        memcpy(&utf32Codepoint, utf32Char.c_str()+4, sizeof(UChar32));

        int width = u_getIntPropertyValue(utf32Codepoint, UCHAR_EAST_ASIAN_WIDTH);
        if ((width == U_EA_FULLWIDTH) || (width == U_EA_WIDE))
        {
            ++widthCount;
        }

    }
    return widthCount;
}
Run Code Online (Sandbox Code Playgroud)

c++ linux unicode utf-8 utf-32

5
推荐指数
1
解决办法
531
查看次数

如何在 C 中将 UTF-16 转换为 UTF-32 并打印结果 wchar_t?

我正在尝试打印出一串 UTF-16 字符。我不久前发布了这个问题,给出的建议是使用 iconv 转换为 UTF-32 并将其打印为 wchar_t 字符串。

我做了一些研究,并设法编写了以下代码:

// *c is the pointer to the characters (UTF-16) i'm trying to print
// sz is the size in bytes of the input i'm trying to print

iconv_t icv;
char in_buf[sz];
char* in;
size_t in_sz;
char out_buf[sz * 2];
char* out;
size_t out_sz;

icv = iconv_open("UTF-32", "UTF-16");

memcpy(in_buf, c, sz);

in = in_buf;
in_sz = sz;
out = out_buf;
out_sz = sz * 2;

size_t ret = iconv(icv, &in, &in_sz, …
Run Code Online (Sandbox Code Playgroud)

c utf-16 iconv utf-32

4
推荐指数
1
解决办法
5586
查看次数

是否可以将包含"高"unicode字符的字符串转换为由utf-32("实际")代码派生的dec值组成的数组?

请查看在(理论上可能的)字符串上运行的脚本:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="jquery.js"></script>
<script>
    $(function () {
        $("#click").click(function () {
            var txt = $('#high-unicode').text();
            var codes = '';
            for (var i = 0; i < txt.length; i++) {
                if (i > 0) codes += ',';
                codes += txt.charCodeAt(i);
            }
            alert(codes);
        });
    });
</script>
</head>
<body>
<span id="click">click</span><br />
<span id="high-unicode">&#x1D465;<!-- mathematical italic small x -->&#xF31E0;<!-- some char from Supplementary Private Use Area-A -->A<!-- char A -->&#x108171;<!-- some char from Supplementary Private Use Area-B …
Run Code Online (Sandbox Code Playgroud)

html javascript utf-8 character-encoding utf-32

4
推荐指数
1
解决办法
1442
查看次数

4
推荐指数
1
解决办法
1779
查看次数

什么字符集用于带有 base64 编码二进制数据的 json?

使用 base64 编码的二进制数据的 JSON (UTF-8/16/32) 最节省空间的字符集是什么?

{ data: "jA0EAwMCxamDRMfOGV5gyZPnyX1BB" }
Run Code Online (Sandbox Code Playgroud)

base64 json utf-8 utf-16 utf-32

4
推荐指数
1
解决办法
3380
查看次数