我的主要平台是 Windows,这就是我在内部使用 UTF-16(主要是 BMP 字符串)的原因。我想对这些字符串使用控制台输出。
不幸的是没有std::u16cout或std::u8cout,所以我需要使用std::wcout。因此,我必须将 u16strings 转换为 wstrings - 最好(也是最简单)的方法是什么?
在 Windows 上,我知道 wstring 指向 UTF16 数据,因此我可以创建一个简单的 std::u16string_view 使用相同的数据(无转换)。但是在 Linux 上 wstring 通常是 UTF32 ......有没有办法在没有宏和假设 sizeof(wchar_t) == 2 => utf16 的情况下做到这一点?
我正在学习 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#中,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支持它.
我需要将输入字符串中的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字符?
我正在开发一个基于终端的程序,它具有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) 我正在尝试打印出一串 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) 请查看在(理论上可能的)字符串上运行的脚本:
<!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">𝑥<!-- mathematical italic small x -->󳇠<!-- some char from Supplementary Private Use Area-A -->A<!-- char A -->􈅱<!-- some char from Supplementary Private Use Area-B …Run Code Online (Sandbox Code Playgroud) 我想用Java编写unicode文字U + 10428. http://www.marathon-studios.com/unicode/U10428/Deseret_Small_Letter_Long_I
我试过'\ u10428'并且它没有编译.
使用 base64 编码的二进制数据的 JSON (UTF-8/16/32) 最节省空间的字符集是什么?
{ data: "jA0EAwMCxamDRMfOGV5gyZPnyX1BB" }
Run Code Online (Sandbox Code Playgroud)