2017-08-11 1 views
2

Es scheint, dass meine WPF-App einige Unicode-Zeichen durch andere ersetzt.Inkonsistente Unicode-Zeichenersetzung mit WPF

Mit diesem einfachen Beispiel:

<Window x:Class="WPFUnicodeFail.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WPFUnicodeFail" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" FontFamily="Segoe UI" FontSize="40"> 

<StackPanel Orientation="Horizontal"> 
    <Label>◀</Label> 
    <Label>&#x25C0;</Label> 
    <Label>◄</Label> 
    <Label>&#x25C4;</Label> 
    <Label>▲</Label> 
</StackPanel> 

ich dieses Ergebnis:

Result with Segoe UI

Während, wenn ich die Schriftart Arial wechseln, bekomme ich diese:

Result with Arial

Nichts davon macht viel Sinn, weil die ersten beiden Etiketten die BLACK LEFT-POINTING TRIANGLE (U+25C0) ◀ sein sollten und die folgenden zwei sollten BLACK LEFT-POINTING POINTER (U+25C4) ◄ sein. Das TRIANGLE soll ein gleichseitiges Dreieck sein, während der POINTER flacher sein soll. Mit Segoe UI wird das TRIANGLE transparent durch den POINTER ersetzt. Mit Arial ist es noch schlimmer, sie sind geschaltet.

Der Versuch, sowohl das Zeichen selbst im Quellcode als auch den Code &#x zu verwenden, führt zu dem gleichen Ergebnis wie in den obigen Bildern.

In Word 2016, versuche ich, die drei verschiedenen Charaktere mit Segoe UI und ich bekomme das richtige Ergebnis (obwohl mit inkonsistenter Skalierung auch wenn die Schriftgröße das gleiche ist, aber das ist ein anderes Thema):

Result with Segoe UI in Word 2016

Warum passiert das? Wie bekomme ich konsistente Ergebnisse mit verschiedenen Schriftarten? Oder zumindest, wie bekomme ich das TRIANGLE mit Segoe UI und anderen Fonts, die es in den POINTER zu verwandeln scheinen?

Antwort

0

Wenn Sie die Schriftarten überprüfen Sie mit der Windows-Zeichentabelle verwenden (Start> Programme> Zubehör> Systemprogramme> Zeichentabelle), werden Sie feststellen, dass der Segoe UI Schrift den U+25C0 Charakter fehlt , so tut es auch die Arial. Ich nehme an, das ist implementierungsspezifisch, wie behandelt das System einen solchen Fall, wenn ein Zeichen angezeigt werden muss, das in der Schriftart fehlt. Wenn Sie die Schriftart Segoe UI Symbol auswählen, können Sie diese Zeichen in einer WPF-App korrekt anzeigen. Vielleicht kann MS Word das automatisch?

Wenn Sie sicherstellen möchten, dass alle Ihre Symbole korrekt in verschiedenen Schriftarten angezeigt werden, sollten Sie diese Schriftarten wahrscheinlich mit dem Werkzeug "Zeichentabelle" überprüfen.