问题标签 [multibyte-functions]

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 投票
0 回答
103 浏览

visual-c++ - 并非所有 ASCII 字符都由 mbstowcs 转码为 wchar_t

我研究了许多类似的问题,但似乎找不到解决问题的方法:我正在尝试将字符从 ASCII 转换为宽字符(Windows UTF16)以在窗口上打印它们(目的是捕获自定义嵌入式应用程序的字符集,包括对部分中文的支持)

当我使用 mbstowcs 时,我最终得到了我想要的东西,除了字符 0x70 和 0x8F(包括)之间的两行,我认为它们必须对应于多字节字符的第一个值。

当我使用 mbstowcs 时,我的 char s[5] 被解释为 UTF-8,它不会将某些值识别为第一个字符 - 我期待一些但没有那么多,我需要诸如单引号和双引号之类的字符......如何我是否在不改变整个项目的情况下强制将其理解为纯 ASCII?

我还尝试了 MultiByteToWideChar(CP_ACP, 0, s, -1, ws, 0); 但是后来我总是到处都是相同的汉字,这对我没有多大帮助......

请注意,这是测试代码。

0 投票
0 回答
305 浏览

visual-studio - WideCharToMultiByte 写入寄存器时产生汉字

我有一段古老的 IE BHO 代码,我正在尝试为它存储一些数据。

我正在尝试这种方法:

我输入的值被写入,可以成功读取。但是,当我在 regedit 中查看时,我看到的是汉字。这将使故障排除具有挑战性,因此我希望正确书写字符。

这显然是某种编码问题,但我似乎找不到解决它的灵丹妙药。

谢谢!

0 投票
1 回答
42 浏览

php - Php - 使用 mb_ 函数从 mysql 数据库中查找输入的前两个字符

目前,我正在使用 mb_strrichr 函数从数据库表行中搜索字符,但我遇到了一个问题。对于这个输入词helloworld,我想搜索它只是数据库中的前 2 个字符,以便它只能搜索he

我当前的代码是:

有什么帮助吗?

0 投票
1 回答
106 浏览

php - 可靠地旋转任何琴弦

我正在试验多字节字符串以及如何处理它们。使用您可以在此处看到的代码

https://gist.github.com/charlydagos/89f67808e01f97e6de91

我成功地旋转了大多数琴弦。但是我注意到这条线

$chr = mb_substr($str, $i, 1);

不适用于标志表情符号,因为它们使用多个 unicode 代码点。

您可以在自己的 shell 中尝试以下操作:

这给出了所需的输出:$ php string_rotate_mb.php "你好"

然而,这会$ php string_rotate_mb.php ""返回[H][C]

这在技术上是正确的,它确实旋转了字符串。但实际上它是单个字形,我想要的输出是单独的标志(或一系列标志,然后变成更加乱码的字形,有时甚至将其变成不同的标志)。

那么,我怎样才能可靠地确定我应该使用 a$length = 1或 a $length = 2(或 a $length = N)获取子字符串mb_substr

作为参考,我使用PHP 7.0.2 (cli) (built: Jan 7 2016 10:40:26) ( NTS ), ZSH_VERSION = 5.2,LC_ALL=en_us.utf-8iTerm2: Build 2.9.git.8dff8db518.

更新 - 2016 年 2 月 5 日

解决方案:https ://gist.github.com/charlydagos/6755ad994da07a7b4959#file-string_rotate_working-php-L39-L56

感谢roeland介绍 Grapheme Clusters 的概念。以下链接中也有很好的信息

0 投票
1 回答
79 浏览

c - C 标准库中多字节字符的显示宽度——数据库的精度如何?

wcwidth标准 C 库的调用返回2亚洲字符。然后是 Unicode 符号,如箭头。对于它返回的那些1。通常情况下,字符比单列宽,但库并没有错,因为终端在单列打印它们并允许视觉重叠,有时会给出不错的结果,例如 ndash“-”。

有没有明显受苦的角色?我想知道亚洲人和其他地区的人如何使用终端,他们开发了哪些解决方案。例如,显示跨越整行并包含当前目录名称的 shell 提示可能是一个严重的问题。可以wcwidth打补丁以获得更好的效果吗?例如,使用github/wcwidth.c作为起点。

0 投票
2 回答
2504 浏览

php - PHP 字符串函数:哪些函数适用于 UTF-8?

PHP 文档中列出了在字节级别上工作的字符串函数。这适用于 SBCS 字符串,但不适用于 MBCS 字符串。幸运的是,一种著名的 UTF-8 编码向后兼容最多 7 位 US-ASCII。

自 PHP 5.6 起,默认编码已更改为 UTF-8,但它的字符串函数没有。众所周知的替代品是iconvMultibyte StringIntl。当以正确的方式编译时,PCRE 函数也可以兼容 MBCS。

当需要将 SBCS 年龄代码转换为符合 VMBCS (UTF-8) 标准时,需要重写标准 PHP 字节字符串函数以保证 MBCS 安全。尽管最基本的函数 (like strpos()) 有一个mb_*变体 (like mb_strpos()),但 PHP 的大多数字符串函数都没有mb_对应的。为了继续使用,它们必须被重写。

在第一阶段,需要确定哪些 SBCS 字符串函数可以工作,尽管它们是面向字节的。有些已经在 SO 上确定,我现在正在寻找的是一个完整的函数列表,这些函数可以与 UTF-8 一起使用,或者在谨慎使用时,例如仅使用 US-ASCII 的参数。澄清一下,问题不在于chr()or之类的字节字符串函数crc32(),而是关于获取函数列表,例如:

  • 不安全:count_chars()计算字节数,...
  • 注意:ltrim()只要参数是 US-ASCII 就可以工作,...
  • 安全:str_repeat()将与 MBCS 字符串一起使用,...

有人知道这样的清单吗?

0 投票
2 回答
71 浏览

php - 处理二进制数据和 mb_function 重载?

我这里有一段代码,我需要保证,或者“不,不,不!” 关于我是否以正确或完全错误的方式考虑这个问题。

这必须处理在特定位置切割二进制数据变量,还必须处理多字节重载函数。例如substr实际上是mb_substrstrlenmb_strlen等。

我们的服务器设置为UTF-8内部编码,所以我做了一个奇怪的小事情来规避它进行二进制数据操作:

我不能真正显示输入和输出结果,因为它是二进制数据。但是使用上述方法的测试似乎工作得很好,没有任何问题......

然而,我的部分大脑在尖叫“你在做什么……这不是处理这个问题的方法”!

笔记:

  • 进来的二进制数据是这两个部分的串联。
  • 第一部分的大小始终是已知的(但会发生变化)。
  • 第二部分的大小完全未知。
  • 这非常接近于加密并将IV填充在前面并再次将其撕掉(奇怪的是,我发现了一些做同样事情的旧代码哈哈)。

所以,我想我的问题是:

  • 这真的很好吗?
  • 还是我忽略了一些非常明显的东西?
0 投票
2 回答
106 浏览

php - 如何使用预定义的字母对 unicode 中的字符串进行排序?

0 投票
1 回答
100 浏览

c++ - 为什么 mingw-w64 上的`std::mbrlen` 总是返回一个(`1`)

当我在 mingw-w64 中编译以下源代码时,我总是从以下位置获得 1(一个)字节std::mbrlen

示例代码基于std::mbrtowc页面中的代码

在我在 mingw-w64 下编译了这个示例之后

我从程序中得到以下输出:

但是,如果我使用cppreference 页面上的“在线”编译器编译相同的代码,或者使用 Arch Linux 下的 GCC(再次使用 simple gcc sample.cxx),或者使用 Microsoft Visual C++ 2017(cl sample.cxx),或者使用 Intel C++ 编译器 2018(icl sample.cxx),我明白了:

std::mbrlen什么可能导致mingw-w64下的这种行为?谢谢。


我的 Microsoft Windows 主机是 Microsoft Windows 10 x86-64。mingw-w64、Microsoft Visual C++和Intel C++下编译在此主机上进行。

0 投票
1 回答
73 浏览

regex - php regexp 搜索将字符串函数替换为 mb 字符串函数

解决方案是研究前瞻和后瞻——RegEx 中的 LookArounds 概念帮助我解决了我的问题,因为当我进行替换时,替换被彼此吃掉了

因此,我们一直在努力对我们的一些旧项目和(可能是坏/旧的编码习惯)进行一些转换,并且正在努力使它们为 php7 做好准备。在这个过程中,我对项目的 .php 文件进行了一些调整,例如

手头的问题是,我在 php 字符串函数(strlen、substr 等)中遇到了丹麦字符的一些问题,并希望他们改用 mb_string 函数。从我可以在互联网上阅读的内容来看,使用“重载”功能不是可行的方法,因此我决定进行基于文件的搜索替换。

我的搜索替换功能现在看起来像这样(感谢@SeanBright 更新

$file 包含以下内容:

这里的重点是实际的 php 代码不必是有效的语法。我只是想让它在不同的场景中工作

我的正则表达式问题是我无法找出这行的原因:

不管用。第一个和第三个 substr 被正确替换,但第二个看起来像这样:

请注意,我的搜索字符串适用于函数名称前面的各种字符,并要求函数名称后面的字符是“(”

在一个完美的世界中,我还想排除作为类方法的字符串函数,例如:$order->mail() 会发送电子邮件。我不希望将其转换为 $order->mb_send_mail()

据我了解,所有参数都是相同的,所以应该不是问题。

完整的脚本可以在这里找到 https://github.com/welrachid/phpStringToMBString