none
Unterschiedliche Darstellung des Fonts Segoe UI Emojis

    Frage

  • Hallo zusammen,
    ich habe im Notpad-Textfile, Schriftart Segoe UI Emoji, folgende Zeichen:

    Diese Zeichen lese ich mittels

    Public Function Read_UTF_8_Text_File(ByVal sFilename As String) As String
        Dim adoStream As ADODB.Stream
        Set adoStream = New ADODB.Stream
        Dim adoStreamSep As String  '-1 bedeutet vbCrLf
        With adoStream
            .Charset = "utf-8"
            .Open
            .LoadFromFile sFilename
            adoStreamSep = .LineSeparator
            Read_UTF_8_Text_File = .ReadText(-1)
        End With
    End Function

    in eine String-Variable (Dim inh As String) ein, die ich dann in eine Word-Tabelle einfüge. Dabei entsteht im Word (Schriftart Segoe UI Emoji ist eingestellt) folgendes Bild (Größe ist hier irrelevant, nur die Zeichenfolge ist wichtig):

    Wie man sieht findet eine Verfälschung statt. Woran kann das liegen, denn mit verschiedenen anderen Zeichen passiert das nicht?

    Grüße-


    Dietrich





    • Bearbeitet dherrmann Mittwoch, 7. Februar 2018 20:05
    Mittwoch, 7. Februar 2018 20:01

Alle Antworten

  • Hi,

    das wird wohl daran liegen, dass Du beim Einlesen oder beim Einfügen/Schreiben das falsche Encoding verwendest. Da gewisse Zeichen mit zwei Byte gespeichert werden, gibt es dann in Word zwei einzelne Byte, die auch als einzelne Zeichen dargestellt werden.

    Da wir nicht wissen, welches Encoding Du beim schreiben der TXT Datei in Notepad verwendest, ist das aber nur eine Vermutung.

    Stell doch die Datei, die Du erstellt hast, mal zum Download zur Verfügung. Dazu bitte den Code, mit dem Du die Zeichenfolge weiterverarbeitest und in Word einfügst. ann kann man sich das mal selbst anschauen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 8. Februar 2018 07:04
  • Hallo Stefan, danke für die schnelle Antwort!
    Die Notepad-Textdatei wird von Whatsapp erzeugt, wenn man einen Chat sich als Email zusendet. Die Zeichen in diesem File stellen 1:1 die Emojis aus dem Chat dar. Sie werden also im Notepad mittels Font Segoe UI Emoji korrekt dargestellt.
    Ich lese dann in meinem VBA diese Textdatein, siehe Funktion in meinem ersten Post. (Weiß jetzt nicht, wie ich so ein File hier hochladen kann...)

    Dann nehme ich via VBA und lese quasi zeilenweise aus diesem Textfile mittels

    Dim inh As Variant
    Dim sp() As String ... inh = Read_UTF_8_Text_File(VerzChats & "\" & File.Name) inh = Replace(inh, Chr(10), Chr(13)) sp = Split(inh, Chr(13)) .... ' dann mit Wordtabelle beispielsweise: table.Cells(zeile,3).Range = sp(0) ' ist nicht echt mit den Parametern, soll nur das Prinzip zeigen

    Ich vermute eben, dass die Umwandlung in String bei dem Split sozusagen verantwortlich ist, weil VBA dann die die Zeichen nicht interpretieren kann. Denn es müsste doch auch Word die Zeichen so abbilden können, wie es bei Notepad geht.
    Leider habe ich keine Idee, wie ich den Schritt zum String umgehen könnte...?

    Grüße-


    Dietrich


    • Bearbeitet dherrmann Donnerstag, 8. Februar 2018 07:53
    Donnerstag, 8. Februar 2018 07:52
  • Hinweise:
    WhatsApp gibt die Textdatei zum Chat als UTF-8-File als Anlage zur Mail aus.

    Nach einigem Testen bin ich der Ansicht, dass es am Word 2007 liegt. Diese ältere Version korrespondiert anscheinend nicht mit dem neueren Notepad, welches mit Windows 10 geliefert wird... (?) Deshalb kann wohl Notepad die Zeichen richtig darstellen, Word 2007 aber nicht.
    Eine Vermutung von mir....

    Grüße -


    Dietrich

    Donnerstag, 8. Februar 2018 09:20
  • Hallo Dietrich,

    Du müsstest doch einen Onedrive Zugang haben (oder eine sonstige Online Ablage, die den Download von Dateien erlaubt). Lad dort bitte mal eine solche Datei hoch.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 8. Februar 2018 09:45
  • Habe keine Online-Ablage... Ich sende dir sie über asp-solutions zu...

    Dietrich

    Donnerstag, 8. Februar 2018 10:11
  • Hallo Dietrich,

    ich habe die von dir im Screenshot gezeigten Zeichen nicht in der Datei. Weder in Notepad, noch in Word.

    Zudem ist die Darstellung bei mir (Windows 8.1, Notepad bzw. Word 2013) auch bei anderen Zeichen "kaputt".

    Die Datei findet man nun hier:

      https://www.aspnetzone.de/Communities/MicrosoftForums/Downloads/7c93b8fd-73f9-4cec-8fd7-f755488bb57a.txt

    Es wäre aber sinnvoller, wenn Du eine Datei bereitstellst, die exakt das beinhaltet, was auch der Screenshot zeigt.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 8. Februar 2018 11:41
  • Nun, ich bin erstmal von der Textdatei ausgegangen, die Whatsapp als Anhang zur Mail bereitstellt. In ihr werden im Notepad mit Fonts Segoe UI Emoji, den du sicher bei dir auch installiert hast im Win8.1, richtig dargestellt! Und dieses Textfile (UTF-8) habe ich dir gesendet.

    Deine verlinkte Ansicht zeigt ebenfalls die richtigen Zeichen, die aus meinem Textfile stammen. Eben genau so, wie sie in meinem Original-Textfile, siehe oben, gezeigt werden.

    Deshalb ist mir nicht klar, dass das Word mit dem selben Font die Zeichen eben nicht so zeigt wie das Notepad.
    Die Verfälschung von einzelnen Zeichen tritt auch dann auf, wenn man einfach den Inhalt vom Notepad nach Word mittels copy/paste kopiert...  So langsam denke ich, dass es da keine Lösung geben wird.

    Grüße-


    Dietrich

    Donnerstag, 8. Februar 2018 12:15
  • Im Notepad:


    Dietrich

    Donnerstag, 8. Februar 2018 12:19
  • Hallo Dietrich,

    wie Du evtl. siehst gibt es zwischen deiner Darstellung in Notepad und meiner schon erhebliche Unterschiede.

    Zum einen werden bei mir nicht alle Zeichen korrekt dargestellt (trotz der richtig ausgewählten Schriftart). Zum anderen sehen die Zeichen größtenteils komplett anders aus.

    Da das Unicode Konsortium die Emojis alle Nase lang ergänzt, denke ich, dass es einfach an unterschiedlichen Versionen liegt. Evtl. verwendet Word auch was anderes als Notepad, ...

    Außer mit dem Encoding kann ich mir das zwar nicht erklären aber daran scheint es wohl doch nicht liegen.

    Die obere Zeile ist meine, die untere deine Ansicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 8. Februar 2018 13:47
  • Hallo Stefan,
    Ich glaube nicht so recht, dass Word einen anderen Font verwendet als Notepad. Stehen die Fonts, wenn installiert, nicht systemweit zur Verfügung?
    Ich habe dir mal via Mail den von mir installierten Font gesandt.

    Aber nun noch eine Frage:
    Ist es möglich in VBA festzustellen, ob ein Zeichen 2 Byte lang ist? Dann könnte man eventuell anders im Programm reagieren...

    Grüße-


    Dietrich

    Donnerstag, 8. Februar 2018 14:58
  • Will mal noch Folgendes ergänzen:
    Ich habe diese Emoji-Zeichen auch alle mal im VisualStudio 2017 im VB.net codiert und interessanterweise werden alle Zeichen im VB-Editor korrekt angezeigt, wo als Schriftart Lucinda Console eingestellt ist...

    Grüße-


    Dietrich

    Donnerstag, 8. Februar 2018 18:37
  • Zusatzfrage:

    LATIN SMALL LETTER N WITH TILDE (U+00F1) => C3 B1

    Diese obige Zeile zeigt die Darstellung (rechts) des Zeichens in 2 hex-Bytes.

    Wie kann man von diesen zwei Bytes ausgehend zu der Darstellung U+00F1 kommen?

    Grüße-


    Dietrich

    Freitag, 9. Februar 2018 09:58
  • ...indem du den UTF-8-String (C3B1) in Unicode (00F1) umwandelst.

    string unicodeString = Encoding.GetEncoding("UTF-8").GetString(bytesOfUtf8Text);

    Gruß
    Heiko


    Samstag, 10. Februar 2018 17:23
  • Es könnte da im VS wie auch in UWP-Apps einen Fallback-Mechanismus geben. Falls ein Zeichen in einer Schriftart nicht dargestellt werden kann, wird es durch eine andere dargestellt. Sicher bin ich mir dazu nicht, habe noch nichts darüber gelesen.

    Gruß
    Heiko

    Samstag, 10. Februar 2018 17:28
  • Die obere Zeile sieht ganz nach Segoe UI Symbol aus, die untere nach Segoe UI Emoji.

    Gruß
    Heiko


    Samstag, 10. Februar 2018 17:30
  • Das ist mir auch schon aufgefallen, in WordPad werden die Zeichen trotz Segoe UI Emoji ebenfalls durch mehrere Einzelzeichen dargestellt, im Gegensatz zu Notepad oder einer normalen TextBox in einer UWP-App, die die FontFamily Segoe UI Emoji besitzt. Eine Erklärung dafür habe ich allerdings auch nicht.

    Gruß
    Heiko

    Samstag, 10. Februar 2018 17:38
  • Die Emojis können zwischen 2 und 28 Bytes lang sein. Viele werden durch verschiedene 2 Byte große Einzelzeichen zusammengesetzt. Z.B. das Zeichen

    "blond-haired women: medium skin tone"

    setzt sich zusammen aus:

    Wenn man wissen möchte, wieviele Bytes ein Emoji besitzt, müßte man auf alle bei Unicode.org registrierten Emojis einzeln prüfen. Das wäre zu mühselig und wird hier kaum das Darstellungsproblem bei Word und WordPad lösen.

    Gruß
    Heiko



    Samstag, 10. Februar 2018 17:54
  • Hi Heiko, - nein, es ist in beiden Fällen Segoe UI Emojis....

    Dietrich

    Samstag, 10. Februar 2018 18:08
  • Hi Heiko,
    habe mal diesen Link gefunden:
    https://wiki.selfhtml.org/wiki/Zeichenkodierung

    Da kann man sehen, dass "Ein Unicode-Zeichen kann in UTF-8 zwischen einem und vier Bytes groß sein."

    Werde mal deinen Tipp mit "...indem du den UTF-8-String (C3B1) in Unicode (00F1) umwandelst." ausprobieren.

    Grüße-


    Dietrich

    Samstag, 10. Februar 2018 18:13
  • Da kann man sehen, dass "Ein Unicode-Zeichen kann in UTF-8 zwischen einem und vier Bytes groß sein."

    ... und Emojis können aktuell wiederum aus 1 bis 7 Unicode-Zeichen bestehen.

    Gruß
    Heiko

    Samstag, 10. Februar 2018 18:27
  • nein, es ist in beiden Fällen Segoe UI Emojis....

    Ich bezog mich auf Stefans letztes Posting, das zwei Zeilen Emojis enthielt. Ich habe zwar direkt auf Antworten auf sein Posting gedrückt, mein Posting landete dann aber deutlich weiter unten.

    Gruß
    Heiko

    Samstag, 10. Februar 2018 18:30
  • das Zuordnen von Antworten, sozusagen hierarchisch, funktioniert hier wohl nicht. Hab ich auch schon bemerkt. Es gibt auch Probleme beim Einfügen Links...

    Nun ja, da muss man sich zu den Emojis mal noch mehr einfallen lassen.

    Im Übrigen bemerke ich gerade, dass dein Codebeispiel C# ist, ich programmiere aber derzeit in VBA. Das mit demVS2017 war sozusagen nur eine Ergänzung, was mir aufgefallen war...

    Grüße-


    Dietrich


    • Bearbeitet dherrmann Samstag, 10. Februar 2018 18:40
    Samstag, 10. Februar 2018 18:34
  • Hallo,

    in der Zwischenzeit habe ich zwei Funktionen gefunden, allerdings für VB.net:

    ConvertFromUtf32 und ConvertToUtf32 ...

    Gibt es dafür entsprechende Funktionen für VBA?
    Wenn's jemand weiß - bitte mitteilen!

    Grüße-


    Dietrich

    Mittwoch, 14. Februar 2018 06:32
  • Vielleicht helfen dir die Methoden von hier weiter.

    Gruß
    Heiko




    Mittwoch, 14. Februar 2018 12:09
  • Hallo Heiko, vielen Dank für deinen Tipp!
    Er bringte sleider auch nicht.

    Auf folgendem Link gibt es einen Converter, der alle Möglichkeiten realisiert.

    https://r12a.github.io/apps/conversion/

    Mich interessierte dort vor allem die vorletzte Möglichkeit "UTF-8 code units". Da wird genau das realisiert, was ich suche. Ich habe dann aus dem Seitenquelltext und dem entsprechende JS-File die folgenden Funktionen "abgeholt:

    function convertUTF162Char ( str ) { 
    	// Converts a string of UTF-16 code units to characters
    	// str: sequence of UTF16 code units, separated by spaces
    	var highsurrogate = 0;
    	var suppCP;
    	var n = 0;
    	var outputString = '';
    	
    	// remove leading and multiple spaces
    	str = str.replace(/^\s+/,'');
    	str = str.replace(/\s+$/,'');
    	if (str.length == 0){ return; }
    	str = str.replace(/\s+/g,' '); 
    	
    	var listArray = str.split(' ');
    	for (var i = 0; i < listArray.length; i++) {
    		var b = parseInt(listArray[i], 16); //alert(listArray[i]+'='+b);
    		if (b < 0 || b > 0xFFFF) {
    			outputString += '!Error in convertUTF162Char: unexpected value, b=' + dec2hex(b) + '!';
    			}
    		if (highsurrogate != 0) {
    			if (0xDC00 <= b && b <= 0xDFFF) {
    				outputString += dec2char(0x10000 + ((highsurrogate - 0xD800) << 10) + (b - 0xDC00));
    				highsurrogate = 0;
    				continue;
    				}
    			else {
    				outputString += 'Error in convertUTF162Char: low surrogate expected, b=' + dec2hex(b) + '!';
    				highsurrogate = 0;
    				}
    			}
    		if (0xD800 <= b && b <= 0xDBFF) { // start of supplementary character
    			highsurrogate = b;
    			}
    		else {
    			outputString += dec2char(b);
    			}
    		}
    	return outputString;
    	}
    
    
    function dec2char ( n ) {
    	// converts a single string representing a decimal number to a character
    	// note that no checking is performed to ensure that this is just a hex number, eg. no spaces etc
    	// dec: string, the dec codepoint to be converted
    	var result = '';
        if (n <= 0xFFFF) { result += String.fromCharCode(n); } 
    	else if (n <= 0x10FFFF) {
    		n -= 0x10000
    		result += String.fromCharCode(0xD800 | (n >> 10)) + String.fromCharCode(0xDC00 | (n & 0x3FF));
        	} 
    	else { result += 'dec2char error: Code point out of range: '+dec2hex(n); }
    	return result;
    	}
    
    function dec2hex ( textString ) {
    	return (textString+0).toString(16).toUpperCase();
    	}
    

    Leider bin ich mit Java nicht sehr "geübt". Auch der Versuch mit einem Java to VB Converterprogramm hat nicht viel gebracht...
    Vielleicht findet sich hier im Forum ein Freund, der in der Lage ist, diesen Code nach VBA umzusetzen?

    Grüße-


    Dietrich


    • Bearbeitet dherrmann Mittwoch, 14. Februar 2018 14:55
    Mittwoch, 14. Februar 2018 14:54