问题标签 [multibyte]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1768 浏览

c++ - 如何在 Windows API 中正确使用 CharNext?

我有一个包含日语和拉丁字符混合的多字节字符串。我正在尝试将此字符串的一部分复制到单独的内存位置。由于它是一个多字节字符串,因此某些字符使用一个字节,而其他字符使用两个。复制部分字符串时,我不能复制“一半”日文字符。为了能够正确执行此操作,我需要能够确定多字节字符串字符的开始和结束位置。

例如,如果字符串包含需要 [2 字节][2 字节][1 字节] 的 3 个字符,我必须将 2、4 或 5 个字节复制到另一个位置,而不是 3,因为如果我要复制 3 我只会复制第二个字符的一半。

为了弄清楚多字节字符串字符的开始和结束位置,我尝试使用 Windows API 函数 CharNext 和 CharNextExA 但没有运气。当我使用这些函数时,它们一次一个字节地浏览我的字符串,而不是一次一个字符。根据 MSDN,CharNext 应该是CharNext 函数检索指向字符串中下一个字符的指针。.

下面是一些代码来说明这个问题:

(请忽略内存泄漏和错误检查失败。)

现在,在上面的示例中,我希望 characterCount 变为 6,因为这是亚洲字符串中的字符数。但相反,characterCount 变为 18,因为 mbString 包含 18 个字符:

我不明白它应该如何工作。CharNext 应该如何知道字符串中的“é–€é”是日本字符的编码版本,还是实际上是字符 é – € 和 é?

一些注意事项:

  • 我已经阅读了 Joels 的博客文章,了解每个开发人员需要了解的有关 Unicode 的内容。不过,我可能误解了其中的一些内容。
  • 如果我只想计算字符,我可以直接计算亚洲字符串中的字符。请记住,我的真正目标是将多字节字符串的一部分复制到单独的位置。单独的位置只支持多字节,不支持宽字符。
  • 如果我使用MultiByteToWideChar将mbString的内容转换回宽字符,我得到正确的字符串(门阜陀阿阻附),这表明mbString没有问题。

编辑:显然 CharNext 函数不支持 UTF-8,但微软忘记记录了。我将自己的例程扔/复制粘贴在一起,我不会使用,需要改进。我猜它很容易崩溃。

0 投票
3 回答
1299 浏览

php - 如何获得多字节字符的确切数量?

我试过:

他们都输出9,而实际上只有3个字符。

计算字符的正确方法是什么?

0 投票
2 回答
3790 浏览

php - 如何使用 PHP 将多字节标点符号转换为单字节标点符号?

例如 , 和 , 都是逗号,但第一个占 2 个字节,而第二个只占 1 个字节。

如何将 2 字节转换为 1 字节?

0 投票
1 回答
97 浏览

php - 为什么用多字节标点符号分割时会有一个额外的空行?

尝试这个:

输出:

0 投票
3 回答
2430 浏览

php - 如何使 jscon_encode 与多字节字符一起工作?

上面会生成类似 "\u6309\u65f6\u95f4\u5148\u540e\u8fdb\u884c\u6392\u5e8f" 的东西,这是一团糟!

0 投票
2 回答
221 浏览

php - 在多字节字符串中将“abc123def”替换为“abc 123 def”

通常我会这样做。

如果我知道它将是 utf-8,我会在模式中添加一个小写的“u”修饰符,我想我会很好。但是由于 utf-8 占用的存储空间是使用本机字符集的 2 倍,在某些情况下是 3 倍,因此我试图不将应用程序限制为 utf-8。

因此,我试图远离我最喜欢的 preg_ 函数。

到目前为止,大多数事情都相当简单,但我有点卡在我通常在 preg_ 中使用字符类的替代品上,例如“\d”。

0 投票
3 回答
25526 浏览

unicode - UTF-8“可变宽度编码”如何工作?

unicode 标准中有足够的代码点,您需要 4 个字节来存储它们。这就是 UTF-32 编码的作用。然而,UTF-8 编码通过使用一种称为“可变宽度编码”的东西以某种方式将这些压缩到更小的空间中。

事实上,它设法在一个字节中表示 US-ASCII 的前 127 个字符,这看起来与真正的 ASCII 完全一样,因此您可以将大量 ascii 文本解释为 UTF-8,而无需对其进行任何操作。巧妙的把戏。那么它是怎样工作的?

我将在这里提出并回答我自己的问题,因为我只是做了一些阅读来弄清楚它,我认为它可能会为其他人节省一些时间。另外,如果我有一些错误,也许有人可以纠正我。

0 投票
2 回答
7355 浏览

php - 检测字符串中的中文(多字节)字符

如何从该字符串中检测汉字并打印以第一个字符开头并以“-”结尾的部分?(它将是“中文字符。更多字符 -”)。

谢谢!

0 投票
1 回答
3602 浏览

php - PHP mbstring.func_overload 与使用 mbstring 函数

我想使我的网站的字符串处理符合 UTF-8 支持其他语言。似乎最好的方法是放弃所有标准的字符串函数。

所以我有两个选择,我可以mbstring.func_overload在 php.ini 中设置选项,或者我可以返回我的代码并将所有函数替换为mb_*. 我认为第二个选项对于使用我的代码的人来说会更容易,因为他们不必更改他们的服务器配置。(如果他们甚至可以!)

PHP 6 什么时候出来?如果这对我的选择有任何影响,因为它将支持正确的多字节处理。

0 投票
1 回答
2125 浏览

postgresql - 在 PostgreSQL 中转换重音字符?

在 PostgreSQL 中是否有现有的函数可以用朴素的字符替换重音字符?字符喜欢åø应该分别变成ao

鉴于此处的评论部分中的示例,我能找到的最接近的东西是翻译功能。

可以使用以下函数搜索一些常用的重音字符:

翻译(搜索术语,'\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\ 303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\ 231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\ 303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\ 264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277','AAAAAAACEEEEIIIINOOOOOOUUUUYSaaaaaaaaceeeeiiiinoooooouuuuyy')