Xterm.js: Problem mit Emojis / Unicode (doppelte Breite angenommen?)

Erstellt am 12. Okt. 2017  ·  24Kommentare  ·  Quelle: xtermjs/xterm.js

In der aktuellen Version 3 scheinen Emojis zwei Zellen einzunehmen. Mit den Pfeiltasten werden zwei Zellen anstelle von einer übersprungen. Durch Löschen werden auch zwei Zellen gelöscht.

kapture 2017-10-12 at 18 34 05

arerenderer duplicate typbug

Hilfreichster Kommentar

Bei VSCode 1.31.1 unter Ubuntu 18.04 tritt dieses Problem auf.

Wenn Sie mit den Pfeiltasten in Ihrem Befehlsverlauf nach oben oder unten scrollen, werden Artefakte so aufgenommen, dass die Wahrscheinlichkeit unleserlich ist, wenn Sie zu einem Befehl gelangen, den Sie ausführen möchten.

Nachdem Sie ein Artefakt gefunden haben, ist das Bearbeiten des Befehls fehlerhaft, da sich die angezeigten Informationen von den in xterm im Speicher befindlichen unterscheiden.

Schritte:

Ein Emoji wurde zu meiner Eingabeaufforderung hinzugefügt:
screenshot from 2019-02-21 11-10-15
Drücken Sie einmal den Pfeil nach oben, um zum Befehl npm i
screenshot from 2019-02-21 11-10-55

Beachten Sie den Schurken n , der der Eingabeaufforderung hinzugefügt wurde.

Entfernen Sie das Emoji von der Eingabeaufforderung in .bashrc und laden Sie den Begriff neu, und der Fehler verschwindet.

Alle 24 Kommentare

Ich kann dies nicht auf macOS / bash reproduzieren. Ich würde nicht erwarten, dass es passiert, wenn wir nicht versuchen, mit der Emoji-Breite zu optimieren (machen Sie es nicht-1). Weitere Details zu den Repro-Schritten wären hilfreich.

Reproduzieren (OSX, MacOS High Sierra)

  • Starten Sie die v3-Demo
  • 😀 mehrmals einfügen
  • Drücken Sie mehrmals die linke Pfeiltaste, um zu sehen, wie jedes Mal zwei Zellen übersprungen werden und in die Zellgrenzen geraten.

Bist du schon auf MacOS High Sierra, weil ich es bin? Vielleicht hängt es auch mit Node-Pty zusammen - ich kann sehen, dass beim Einfügen eines Emoji in Terminal.app automatisch ein Leerzeichen nach dem Emoji hinzugefügt wird, und noch mehr, ich kann dieses Leerzeichen nicht auswählen, es ist, als würde High Sierra es bedrohen es als doppelt breites Zeichen ...

Terminal.app unter MacOS High Sierra
kapture 2017-10-13 at 22 55 32

Dies könnte eine Sache der High Sierra sein, bei der versucht wurde, Emojis im Terminal besser zu machen? Ich kann derzeit kein Update durchführen, da das Rendern in Electron-Apps durcheinander gebracht wird.

Ich hasse es zu sagen, dass ich ein Upgrade durchgeführt habe und jetzt stecke ich mit Tonnen von Rendering-Störungen in all diesen chrombasierten Apps fest 😤

Ja, ich habe vor dem Update sorgfältig darauf geachtet, das Feedback zu verfolgen, da ähnliche Dinge mit Sierra passiert sind, denke ich.

Ich stelle fest, dass Terminal.app eine schöne Emoji-Erfahrung hat, bei der sie als richtig breite Zeichen behandelt werden. Wir können es wahrscheinlich tun, wenn sie können 😄

UAX # 11 East Asian Width, Revision 31 hat Emoji _East Asian Wide_ (doppelte Breite) geändert, und wcswidth in wchar.h gibt die Breite der Zeichenfolgen zurück. Ich denke, macOS High Sierra hätte das Update unterstützt.
xterm.js ' wcwidth in src/CharWidth.ts hat es noch nicht unterstützt.

@ mandel59 danke für die info!

@ mandel59 Ich denke, dieses Problem ist spezifisch für Emoji. Ich denke, CJK-Zeichen sollten korrekt als Zeichen mit doppelter Breite kategorisiert werden (einige Komponenten können jedoch

VS-Code-Problem: https://github.com/Microsoft/vscode/issues/59145

Anscheinend zeigt der Flatterlauf dieses Verhalten

Hier ist ein kleiner Dart-Repro für das, was wir sehen, für den kein Flattern erforderlich ist (allerdings ist Dart erforderlich):

import 'dart:async';

import 'dart:io';

// Windows console font has a limited set of Unicode characters.
final _animation = Platform.isWindows
    ? <String>[r'-', r'\', r'|', r'/']
    : <String>['🌕', '🌖', '🌗', '🌘', '🌑', '🌒', '🌓', '🌔'];
final _backspace = '\b' * _animation[0].length;

main() {
  int ticks = 0;
  void update(Timer timer) {
    if (ticks % 50 == 0) {
      stdout.write('\nDoing thing... ');
    }
    stdout.write('$_backspace${_animation[ticks++ % _animation.length]}');
  }

  new Timer.periodic(const Duration(milliseconds: 100), update);
}

Speichern Sie als .dart -Datei und führen Sie sie dann mit dart xxx.dart . Dieser Code gibt hier zwei Backspaces für dieses Zeichen aus, wodurch das Zeichen in einem Standard-MacOS-Terminal korrekt entfernt wird. Im VS-Code-Terminal wird jedoch das Emoji und dann ein anderes Zeichen zurückgesetzt. Wenn sich das Emoji am Anfang der Zeile befand, hat dies keine Auswirkung. Wenn dies nicht der Fall ist, schleicht sich das Rendering langsam um ein Zeichen nach links (und lässt die rechte Hälfte des Symbols danach).

Wenn Sie die * _animation[0].length aus der Rücktaste entfernen, sodass immer eine einzelne Rücktaste verwendet wird, funktioniert dies im VS-Code-Terminal einwandfrei, im macOS-Terminal jedoch nicht mehr genügend Backspaces (sodass die Monde dann nach rechts kriechen) !).

Gilt auch für Hebräisch / Arabisch, wie unter https://github.com/Microsoft/vscode/issues/60470 angegeben

Bei VSCode 1.31.1 unter Ubuntu 18.04 tritt dieses Problem auf.

Wenn Sie mit den Pfeiltasten in Ihrem Befehlsverlauf nach oben oder unten scrollen, werden Artefakte so aufgenommen, dass die Wahrscheinlichkeit unleserlich ist, wenn Sie zu einem Befehl gelangen, den Sie ausführen möchten.

Nachdem Sie ein Artefakt gefunden haben, ist das Bearbeiten des Befehls fehlerhaft, da sich die angezeigten Informationen von den in xterm im Speicher befindlichen unterscheiden.

Schritte:

Ein Emoji wurde zu meiner Eingabeaufforderung hinzugefügt:
screenshot from 2019-02-21 11-10-15
Drücken Sie einmal den Pfeil nach oben, um zum Befehl npm i
screenshot from 2019-02-21 11-10-55

Beachten Sie den Schurken n , der der Eingabeaufforderung hinzugefügt wurde.

Entfernen Sie das Emoji von der Eingabeaufforderung in .bashrc und laden Sie den Begriff neu, und der Fehler verschwindet.

Das Wichtigste zuerst, ich wollte euch für eure großartige Arbeit danken.

VSCode 1.31.1 unter macOS Mojave 10.14.3 erfährt dasselbe. Das von @juliusecker erwähnte n Ding passiert mir auch genau so, wie er es beschrieben hat.

Ich habe den gleichen Fehler wie von @juliusecker erwähnt.
VSCode Version 1.33.1 (1.33.1) 51b0b28134d51361cf996d2f0a1c698247aeabd8 2019-04-11T08: 14: 39.158Z
Systemversion: macOS 10.14.4 (18E226)
zsh 5.7.1 (x86_64-apple-darwin17.7.0)

Sehr einfach in VSCode und Powershell zu reproduzieren.

emojiterminaltest.ps1

"Emoji Normal"
"😊1😊2😊3😊4"
"Emoji with Padding Spaces - What it should look like"
"😊  1😊  2😊  3😊  4"

image

Sind diesem Element Ressourcen zugewiesen? Sieht aus wie viele Regressionen in anderen Programmen (Hyper usw.), wie in diesem Themen-Thread zu sehen.

@jerch ist dies ein Duplikat von https://github.com/xtermjs/xterm.js/issues/1709?

@ Tyriar Ja, irgendwie, es ist nur ein Beispiel, wo ppl höchstwahrscheinlich damit konfrontiert wird - emojis: smile_cat:

Ich denke, wir werden beide offen halten, da dies das Problem gut beschreibt und # 1709 sich mehr mit der Lösung befasst, und diese hat eine Reihe von positiven Stimmen.

Es ist in Windows 10, der folgenden Version, replizierbar:
image

image
Das Obige ist das, was ich in einem integrierten VS-Code-Terminal sehe.
image
Das Obige sehe ich, wenn derselbe Text in einer Textdatei im VS-Code geöffnet wird.

Problem ist seit fast zwei Jahren, irgendein Update?

@jerch will es bald schaffen, er hat aber ein paar Sachen im Gange. Einer der großen Blocker dafür war das neue Addon-System, das jetzt veröffentlicht wird.

Schließen zugunsten von https://github.com/xtermjs/xterm.js/issues/1709, da sie im Wesentlichen dasselbe sind und wir unseren Problemzähler niedrig halten möchten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

chris-tse picture chris-tse  ·  4Kommentare

LB-J picture LB-J  ·  3Kommentare

zhangjie2012 picture zhangjie2012  ·  3Kommentare

fabiospampinato picture fabiospampinato  ·  4Kommentare

Mlocik97-issues picture Mlocik97-issues  ·  3Kommentare