如何将带有重音的字符转换为打字稿中的普通拉丁字符对应字符?

时间:2017-12-11 13:57:46

标签: typescript unicode

我想转换带有重音符号或相似字符的字符:

  • std::cout << Ansi_t::clrscr() << std::flush; // clears the screen std::cout << Ansi_t::gotoRC(5, 25) << '*' << std::flush; // position the cursor, and output a single 'dot': áà应成为â
  • "a"é应为ê
  • eÇ

可以通过连接一百万个C电话来完成,但我正在寻找更优雅的解决方案。困难在于找出哪个普通字符属于哪个扩展字符。我很容易发现 .replace(...) á 的扩展名。但是如何自动执行此步骤?

为什么我要这样做:

我在两个应用程序之间有一个接口。 Application One提供包含所述重音的数据。应用程序2只能处理与a匹配的数据。

1 个答案:

答案 0 :(得分:1)

您可以使用库latinize,可通过以下方式安装:

((Get-Content numbers.txt -raw) -split '[\r\n;]+' | Measure-Object -Maximum).Maximum

由于您使用的是打字稿,您也可以输入:

npm install latinize

用法:

npm install @types/latinize

在内部,它通过正则表达式和回调函数替换不是拉丁字符或阿拉伯数字的每个字符。

var latinize = require('latinize');
latinize('ỆᶍǍᶆṔƚÉ áéíóúýčďěňřšťžů'); // => 'ExAmPlE aeiouycdenrstzu'

并通过预定义的character lookup table找到目标角色。

最后,该解决方案也是一种搜索和替换方法。我知道你想自动发现字符,但字体系统不能那样工作。

计算机和JavaScript不知道角色的设计和含义。相反,角色只不过是我们用来识别符号的随机数。而且这个系统非常随意,而且没有太多的内部一致性。

因此,即使您知道function latinize(str) { if (typeof str === 'string') { return str.replace(/[^A-Za-z0-9]/g, function(x) { return latinize.characters[x] || x; }); } else { return str; } } 应该通过其设计与â相关联,但计算机只知道在UTF8中它有一个数字a。你希望它是U+00E2

然而,只知道数字就没有联系。你必须比较符号,这几乎是不可能的,尤其是。如果你得到非常相似的外观符号,例如ΑU+0061到A U+0391

没有办法计算意义。您必须自己(或通过图书馆的帮助)将扩展角色映射到拉丁语中。