Xterm.js: xterm.js 中的 Unicode 处理

创建于 2018-09-25  ·  10评论  ·  资料来源: xtermjs/xterm.js

来自 #1707 似乎由于表情符号,正确的 unicode 处理对人们来说越来越成为一个问题。 由于我们都喜欢表情符号,因此应该尽快修复:smile:

提议:
为不同的 unicode 版本创建一个提供程序,它能够将特定于版本的数据和实现隐藏在一个不错的 API 后面。 目前,我们只需要 wcwidth 的版本相关实现,因此粗略的草图可能如下所示:

interface IUnicodeProvider {
  supportedVersions(): string[];
  getVersion(): string;
  setVersion(version?: string);  // version optional for fallback behavior
  wcwidth(ucs: number): number;
  getStringCellWidth(s: string): number;
  ... // more to come with support of other unicode features
}

理想情况下,提供者是自包含的,因此终端只需要处理接口方法并在需要时更新版本/语言环境。 提供者必须处理低级别的东西以提供正确的数据集,因此这些方法对于受支持的版本只能按预期工作。
然后,在提供程序中,我们可以决定数据是在代码库中静态提供,还是尝试动态创建数据。 首先会对 xterm.js 的大小产生相当大的影响,其次会引发异步问题(请记住 - 大多数核心部分都是同步 atm)。 整个 unicode 内容也可以捆绑到 XY 版本的某些插件之类的功能中。

起来讨论。
/cc @Tyriar , @bgw , @mofux , @dnfield

areparser typenhancement

最有用的评论

https://github.com/xtermjs/xterm.js/pull/2568中的新尝试,希望我们可以在下一个版本中推出它。

所有10条评论

我认为这样的事情可能更平易近人:

interface IUnicodeProvider {
  getVersion(): string;
  wcwidth(ucs: number): number;
  getStringCellWidth(s: string): number;
  ... // more to come with support of other unicode features
}

使用UnicodeProviderFactory.v11之类的东西在编码时会更好一些,但这对我来说无论如何都是有意义的。

@dnfield是的,无论哪种方式都可以。 不确定我们是否需要版本级别的类型信息。

我的想法是创建一个接口,它可以在运行时透明地进行版本切换,如下所示:

// terminal ctor - create the provider
this.unicodeProvider = new UnicodeProvider();
...
// some code that knows whether to switch unicode versions
this.unicodeProvider.setVersion(xy);
...
// some unicode consumer - does not care about versions at all, just gets the right method
this.unicodeProvider.wcwidth(...)

这样this.unicodeProvider可以随身携带,而无需在版本更改后重新附加或在终端实例上使用昂贵的属性。

我从 #1707 的讨论中得到的信息:

  • 我们现在想提供两个 wcwidth 表版本,一个是旧的,一个是由@dnfield 创建的新的。
  • 正如@gnachman指出的那样,模棱两可的字符不值得麻烦。 大多数应用程序都处理它们的半角,所以我们可以做同样的事情(已经在旧表中完成,需要用新表进行测试)。
  • 为 unicode 版本创建一个新的全局选项。 该选项必须由集成商设置或提供给用户以进行运行时更改。
  • 推迟创建新的转义序列以设置 unicode 版本,因为尚未建立注册非标准序列的接口。
  • 目前没有神奇的 unicode 版本猜测器。 一旦我们将来使用这样的工具,它无论如何都会在 xterm.js 之外(也许它可以作为一个单独的包存在于 org 中)。
  • 将来我们可能需要提出 unicode 插件来保持 xterm,js 的包大小。

任何接受者将其纳入 TS 代码?

在#1714 中做了第一个可能的化身。 从 #1707 复制新表,希望没问题(@dnfield)。

没问题!

https://github.com/xtermjs/xterm.js/pull/1714是一个很好的参考,但计划是在新的插件模型之后发布几个插件(https://github.com/xtermjs/xterm. js/issues/1128) 中,然后让嵌入器选择正确的版本。

请尽快修复,最近更新 Windows 似乎打破了这一点。 我正在尝试支持一个 Node.js 库,该库 emoji'fies 记录的某些方面以便于阅读(这听起来比它更愚蠢)。

https://github.com/xtermjs/xterm.js/pull/2568中的新尝试,希望我们可以在下一个版本中推出它。

@jerch我们可以在合并#2568 的情况下将此称为关闭吗?

@Tyriar Yepp,已经有后续跟进了 :smile_cat: --> #2668

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Tyriar picture Tyriar  ·  4评论

Mlocik97-issues picture Mlocik97-issues  ·  3评论

jerch picture jerch  ·  3评论

johnpoth picture johnpoth  ·  3评论

fabiospampinato picture fabiospampinato  ·  4评论