【问题标题】:How to convert strange strong/bold Unicode to non bold UTF-8 chars in php?如何在php中将奇怪的强/粗体Unicode转换为非粗体UTF-8字符?
【发布时间】:2017-02-15 16:00:47
【问题描述】:

我正在尝试使用 twitter api 在我的数据库中存储一条推文, 但我得到了这种似乎是“自然”粗体字符的战略字符

普通字符:

azertyuio

奇怪的字符:

???????????? ???????? ???????????????????? ???????????? ???????????? ????????????????????????????????????????!!

如果我将 strongs 字符粘贴到我的 netbeans 编辑器中,我会得到类似方形字符的东西......

我以前从未见过。您能帮我在 php 中将此文本转换为非粗体字符吗?

【问题讨论】:

  • 什么数据库?表结构是什么,特别是您使用的字符集/排序规则?这看起来像一个字符集问题。看来您需要在 php 客户端脚本中使用 UTF-8 并存储在表中的字段中。看到这个问题:stackoverflow.com/questions/8274972/…
  • 例如 var_dump(ord('????')); //返回 240 var_dump(ord('s')); //返回 115
  • 这些是 unicode 字符,特别是 MATHEMATICAL SANS-SERIF BOLD SMALLU+1D400U+1D7FF
  • 好的,谢谢,但是如何将其字符转换为“经典”字符?好奇怪……为什么推特使用这种字符?
  • 您可以致电iconv 或PHP 的相关库/插件吗? $ echo ???????????? ???????? ???????????????????? ???????????? ???????????? ???????????????????????????????????????? | iconv -f UTF-8 -t ASCII//TRANSLIT 产生 set is ready for the discussion

标签: php character-encoding unicode-string


【解决方案1】:

使用http://slothsoft.net/getResource.php/slothsoft/unicode-mapper源,我做了一个函数:

public function convertSpecialCharToNormalChar($text) {
    $target = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"];
    $specialList = [
        'serifBold' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '❗', '❓', '.', ',', '"', "'"],
        'serifItalic' => ['?', '?', '?', '?', '?', '?', '?', 'ℎ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"],
        'serifBoldItalic' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '❗', '❓', '.', ',', '"', "'"],
        'sans' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '?', '.', ',', '"', "'"],
        'sansBold' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '❗', '❓', '.', ',', '"', "'"],
        'sansItalic' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"],
        'sansBoldItalic' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '❗', '❓', '.', ',', '"', "'"],
        'script' => ['?', '?', '?', '?', 'ℯ', '?', 'ℊ', '?', '?', '?', '?', '?', '?', '?', 'ℴ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'ℬ', '?', '?', 'ℰ', 'ℱ', '?', 'ℋ', 'ℐ', '?', '?', 'ℒ', 'ℳ', '?', '?', '?', '?', 'ℛ', '?', '?', '?', '?', '?', '?', '?', '?', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"],
        'scriptBold' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '❗', '❓', '.', ',', '"', "'"],
        'fraktur' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'ℭ', '?', '?', '?', '?', 'ℌ', 'ℑ', '?', '?', '?', '?', '?', '?', '?', '?', 'ℜ', '?', '?', '?', '?', '?', '?', '?', 'ℨ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"],
        'frakturBold' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '❗', '❓', '.', ',', '"', "'"],
        'monospace' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '?', '.', ',', '"', '''],
        'fullwidth' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', '''],
        'doublestruck' => ['?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'ℂ', '?', '?', '?', '?', 'ℍ', '?', '?', '?', '?', '?', 'ℕ', '?', 'ℙ', 'ℚ', 'ℝ', '?', '?', '?', '?', '?', '?', '?', 'ℤ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '❕', '❔', '.', ',', '"', "'"],
        'capitalized' => ['ᴀ', 'ʙ', 'ᴄ', 'ᴅ', 'ᴇ', 'ꜰ', 'ɢ', 'ʜ', 'ɪ', 'ᴊ', 'ᴋ', 'ʟ', 'ᴍ', 'ɴ', 'ᴏ', 'ᴘ', 'q', 'ʀ', 'ꜱ', 'ᴛ', 'ᴜ', 'ᴠ', 'ᴡ', 'x', 'ʏ', 'ᴢ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '﹗', '﹖', '﹒', '﹐', '"', "'"],
        'circled' => ['ⓐ', 'ⓑ', 'ⓒ', 'ⓓ', 'ⓔ', 'ⓕ', 'ⓖ', 'ⓗ', 'ⓘ', 'ⓙ', 'ⓚ', 'ⓛ', 'ⓜ', 'ⓝ', 'ⓞ', 'ⓟ', 'ⓠ', 'ⓡ', 'ⓢ', 'ⓣ', 'ⓤ', 'ⓥ', 'ⓦ', 'ⓧ', 'ⓨ', 'ⓩ', 'Ⓐ', 'Ⓑ', 'Ⓒ', 'Ⓓ', 'Ⓔ', 'Ⓕ', 'Ⓖ', 'Ⓗ', 'Ⓘ', 'Ⓙ', 'Ⓚ', 'Ⓛ', 'Ⓜ', 'Ⓝ', 'Ⓞ', 'Ⓟ', 'Ⓠ', 'Ⓡ', 'Ⓢ', 'Ⓣ', 'Ⓤ', 'Ⓥ', 'Ⓦ', 'Ⓧ', 'Ⓨ', 'Ⓩ', '⓪', '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '!', '?', '.', ',', '"', "'"],
        'parenthesized' => ['⒜', '⒝', '⒞', '⒟', '⒠', '⒡', '⒢', '⒣', '⒤', '⒥', '⒦', '⒧', '⒨', '⒩', '⒪', '⒫', '⒬', '⒭', '⒮', '⒯', '⒰', '⒱', '⒲', '⒳', '⒴', '⒵', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '⓿', '⑴', '⑵', '⑶', '⑷', '⑸', '⑹', '⑺', '⑻', '⑼', '!', '?', '.', ',', '"', "'"],
        'underlinedSingle' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"],
        'underlinedDouble' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"],
        'strikethroughSingle' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"],
        'crosshatch' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"],
    ];

    foreach ($specialList as $list) {
        $text = str_replace($list, $target, $text);
    }

    return $text;
}

【讨论】:

  • 我有 utf-8 编码的 MySQL 字段。一些特殊字符有 mb4,甚至这里的一些数学字符有 utf-16。由于限制,我无法升级色谱柱,但这个功能是救星。
  • 我觉得使用它很糟糕,但它有效 :D 用它在输入中添加粗体文本。
  • @ALZlper 为什么用的时候心情不好?
  • 我猜“正确的方式”应该是一个 div(可以选择使用 contenteditable),但是有了这个解决方案,我不必重新构建我的所有表单
  • 另外,我感谢您的回答! +1
【解决方案2】:

这是使用 UTF 或 HTML 实体字符编码而不是 ansi 的原因之一。 UTF 允许您存储和显示此类字符(以及来自其他语言的字符),当有人以这些语言/字符集输入这些字符时处理搜索(仅匹配以相同字符编写的内容)等等。

另一种方法是为人们选择使用的每个奇怪的字符集编写一个“转换”。不过,转换这些是可能的——你只需要决定它是否真的值得你花时间。

您提交的字符称为无衬线数学粗体字符。您可以找到列表here at w3.org。此外,还有标准的、倾斜的、倾斜的粗体变体(使用该页面顶部的上一个和下一个链接)。

您将遇到的问题是,与将大写字符切换为小写(将 32 加到十进制值或 chr(ord(x)+32) )不同,不会有一个设置的十进制数量可用于将所有字符从数学粗体切换为每个字符组的 ANSI 等效项。同样,ord() 和 chr() 不适用于这些字符。

例子:

? 是 120302,a 是 97。120302 - 97 = 120205
? 是 120276,A 是 65。120276 - 65 = 120211

因此,减去 120205 会得到正确的小写字母 a 来表示 ?,但是同样的方法不适用于 ?。这意味着您必须确定字符是哪个字符集(数学粗体、倾斜数学等),识别它所属的子集(a-z、A-Z、0-9),然后使用您计算出的相应偏移量来纠正它。为此,您必须检查每条推文的每个字符是否符合您支持的转换字符集之一,然后将其转换为这些字母。

如果有大量推文仅使用数学粗体,这可能是值得的,但如果您要导入大量推文 * 可能包含各种潜在字符,那么您需要做很多工作.

如果您认为值得,您需要做的第一件事是查看您从 API 接收的原始字符编码,是否需要转换,然后决定是否要在字符集之间进行映射使用字符数组,使用子集的值范围或其他方法。您还需要决定如何扫描这些字符。

总而言之,您的问题的答案是可以转换它们,但您的情况和细节将决定它是否值得以及您如何完成它。这不是可以为你写的东西。

【讨论】:

  • 哇哦!非常感谢您的回复 :) 现在我明白了 ;) 我会看一下 我可以在网上找到解决这个问题的功能(但我怀疑......)我会随时通知你 ;) 谢谢
  • 对于带有这种字符的信息推文是由扩展而不是 twitter 本地制作的
  • @J.Doe 仅供参考。您面临的问题可以类似地描述为试图将 Emoji 转换为单词。您正在尝试处理字符而不是表情符号。在任何一种情况下,所需要的都是相同的——你需要知道每种手机的每个表情符号,以及每个对应的词来替换它。各种字符集和它们应该被替换的预期字符也是如此。编辑:我说的一样,因为从计算机的角度来看它们是相同的——只是 unicode 字符。
猜你喜欢
  • 1970-01-01
  • 2020-01-09
  • 2019-04-08
  • 1970-01-01
  • 2021-10-05
  • 2021-11-30
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多