【问题标题】:unicode char valueunicode 字符值
【发布时间】:2012-10-05 19:50:48
【问题描述】:

问题:按值排列的 Unicode 扩展符号的正确顺序是什么?

如果我对 Unicode 字符列表进行 excel 排序,则顺序与我使用 excel "=code()" 并按这些值排序时不同。目的是我想测量字符之间的距离,例如 a-b = 1 和 &-% = 1;当使用 excel 排序功能进行排序时,在三个内排序的两个字符的值似乎在 134 之外。

此外,一些字符符号在 excel 中是空白的,并且有几个用“查找”找到了两次,并且是两个不同的符号 - 有几个根本找不到。请解释这些“特殊”字符的详细信息。

http://en.wikipedia.org/wiki/List_of_Unicode_characters

示例代码:

int charDist = abs(alpha[index] - code[0]);

编辑: 为了找出 c++ vs2008 中的 UNICODE 值,我运行每个代码作为从代码 1 到代码 255 与代码 1 的比较

cout << mem << " code " << key << " is " << abs(key[0] - '') << " from " << endl;

括号里是一个黑色的笑脸,这个网站没有字体,但是命令窗口有,在vs2008中看起来像半张贴|用 T 的右半部分。Excel 留下一个空白。

在 c++ vs2008 中使用 std 库和#include 不处理以下 Unicode 9, 10, 13, 26, 34, 44,

而且,代码 1 到 127 的数字“距离”是正确的,但在 128 处,距离会跳过一个额外的距离,并且由于某种原因更远。然后从 128 到 255,距离反转并变得更近; 255 距离 1 '' 2

如果这些遵循更合乎逻辑的东西并且只有 1 到 255 没有打嗝或跳过和反转,并且 255-1 = 254 但嘿,我知道什么,那就太好了。

EDIT2:我发现它 - 没有绝对值 - UNIFORMAT 的排序规则是 128 到 255,然后是 1 到 127 并产生 1 到 255,其中 9、10、13、26、34、44 的 6 个跳过是垃圾。这并不直观。在新的顺序 128->255,1->127 中,从 127 到 128 的奇怪跳转更加清晰,这是因为没有 0,所以在 255 和 1 之间缺少值。

解决方案:使用每个符号的值制作我自己的哈希表,并且不要依赖 c++ std 库或 vs2008 来提供 UNIFORMAT 值,因为它们对于测量 UNIFORMAT 的几个特定子集之外的字符距离是不正确的。

【问题讨论】:

  • 你想达到什么目的?这对我来说就像一个XY problem
  • 对任意 Unicode 数据进行排序是一个极其复杂的问题。由于某些语言中的奇怪排序规则(例如,在西班牙语中,chll 都被视为一个字母,因此它不像对 ASCII 字符的数值进行排序那么简单用于分类目的)。您真正想要解决的问题是什么?
  • 字符集中代码点的顺序通常是called collation,而不是编辑距离(例如HammingLevenshtein
  • 术语“整理”是一个很好的起点。因此,我需要了解排序规则以允许将字符距离测量为汉明算法的函数,该算法包括扩展的 Unicode 字符集的全部范围。感谢您提供更多信息。
  • 响应'several are found两次';值得注意的是,某些 Unicode '字形' 可以由多个 Unicode '码点' 表示,甚至可以表示为 多个 码点的组合。例如,大多数欧洲重音字符可以有自己的代码点,但也可以通过将非重音字符的代码点与表示“添加重音”的特殊代码点组合生成。另一个例子是欧米茄字形,它由希腊字母代码点和“数学符号”代码点表示。

标签: c++ excel unicode char collation


【解决方案1】:

Unicode 没有定义的排序(或整理)顺序。当 Excel 排序时,它使用基于当前所选语言的表格。例如,在英语模式下使用 Excel 的人可能会得到与在葡萄牙语模式下使用 Excel 不同的排序结果。

还有标准化的问题。使用 Unicode,一个“字符”不一定对应一个值。一些字符可以用不同的方式表示。例如,大写的欧米茄可以编码为希腊字母或表示电阻单位的符号。在某些语言中,单个字符可能由多个连续值组成。

空白值可能对应于您没有任何字体覆盖的字形。一些系统使用所谓的“Unicode 字体”,其中包含每个脚本所需的大部分字形。当当前字体没有必要的字形时,Windows 倾向于即时切换字体。这两种方法都不需要所有字形。此外,一些 Unicode 值不编码为可见字形(例如,Unicode 中有许多不同类型的空格),一些值更像 ASCII 样式的控件代码(例如,段落分隔符或双向控件),还有一些值只有当它们与另一个字符组合时才有意义,就像许多“组合”重音一样。

所以没有一个你会满意的答案。或许,如果您提供更多关于您最终想要做什么的信息,我们可以建议一种不同的方法。

【讨论】:

  • @Adrian_McCarthy,谢谢,这证实了我的怀疑,即 excel 是根据语言进行排序的。在最好的情况下,我希望有 999 个符号,我认为这将很快推出。目前,255 适用于我的案例中实际存在的“真实”场景。我将符号读入哈希和关联的字符串,因此我可以从字符串哈希到单个符号并使用这些符号,直到将它们哈希回字符串时打印出来。我用 * ?和 z 代表荒野。
  • 在 excel 中,countif(255 char, this char) for * 返回 255 char count - 通常 * 是 'all' 的通配符,我假设 excel 识别 thai 并返回所有 char 作为匹配项?一样吗?
【解决方案2】:

我不认为你可以在 Excel 中做你想做的事而不显着限制你的方法。

通过实验,代码函数永远不会返回高于 255 的值。如果您使用无法通过此 VBA 代码生成的任何 unicode 文本,它将被解释为问号 (?) 或 63。

For x = 1 To 255
    Cells(x, 1).Value = Chr(x)
Next

您应该能够使用代码确定差异。但如果该字符不属于该领域,则需要离开 Excel,因为即使是 VBA 也会将任何其他 Unicode 字符转换为问号 (?) 或 63。

【讨论】:

  • @Daniel_Cook,谢谢。我应该更清楚的是,我使用 excel 来形成一个 csv 文件,其中包含一列 UNICODE 符号和一列我想与每个符号关联的字符串,例如,“003”=='3';您的建议有所帮助,我将在 C++ 中尝试类似的代码来查找识别哪些符号以及每个符号的整理值。
猜你喜欢
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2023-04-04
相关资源
最近更新 更多