unicode char值

时间:2012-10-05 19:50:49

标签: c++ excel unicode char collation

问题:按字符串扩展符号的正确顺序是什么?

如果我excel排序Unicode字符列表,那么顺序与我使用excel“= code()”并按这些值排序的顺序不同。目的是我想测量字符之间的距离,例如a-b = 1和& - %= 1;当使用excel排序函数排序时,在三个中排序的两个字符似乎具有134个值的值。

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

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它看起来像一个半职位|使用右半部分.Excel留空。

使用std库和#include在c ++ vs2008中不处理以下Unicodes 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,其中6个跳过9,10,13,26,34,44是垃圾。这不直观。在新订单128-> 255,1-> 127中,从127到128的奇怪跳过更清楚,这是因为没有0所以在255和1之间缺少值。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

我认为你不能在Excel中做你想做的事情,而不会显着限制你的方法。

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

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

您应该能够使用Code确定差异。但是如果角色不属于那个领域,你需要走出Excel,因为即使是VBA也会将任何其他Unicode字符转换为问号(?)或63。