2010-11-24 11 views
5

Zajmuję się tworzeniem kodu służącego do prezentacji symboli walut w ramach etykiety na mojej aplikacji i mam listę referencyjną symboli walut w formacie szesnastkowym Unicode. W moim kodu mam formatowania walutę następująco:Umieszczanie symboli walutowych w ciągach .NET

(symbol waluty) (ciąg znaków po przecinku) (opis walucie)

Podejście to działa dobrze dla większości symboli, jednak widzę, że niektóre symbole są automatycznie przesuwane na prawo od wartości dziesiętnej, nawet jeśli jest wyraźnie umieszczone po lewej stronie. Używając debuggera, widzę to zachowanie nawet na najbardziej podstawowym poziomie w samych łańcuchach, więc nie jest to przypadek jakiejkolwiek manipulacji na wyższych poziomach przez renderowanie w warstwie prezentacji. Poniższy kod prezentuje prosty przypadek wykazujący problem:

string rialSymbol = "\ufdfc"; 
string amount = "123.45"; 
string description = "Rials"; 
string plainConcat = rialSymbol + " " + amount + " " + description; 
Debug.WriteLine(plainConcat); 

wyjścia debugowania (co odpowiada również to, co widać w interfejsie aplikacji) jest następujący:

123,45 (rial symbol) riali

(Uwaga: symbol jest po prawej stronie ułamka dziesiętnego, a nie po lewej, jak podano)

Próbowałem wielu podejść i odmian formatowania ciągów, formatowania kultur itp., Ale nic nie wydaje się zajmować tym problemem. Jak mogę wymusić umieszczenie znaku Unicode bez decydowania o rozmieszczeniu symbolu względem wartości dziesiętnej? Działa to z większością innych znaków, dlaczego Rial (i kilka innych) powoduje ten typ podstawowego zachowania łańcuchowego?

Odpowiedz

9

U+FDFC to znak Unicode od prawej do lewej. Ma być osadzony w tekście od prawej do lewej. Zmieniasz tekst od lewej do prawej i od prawej do lewej.

Od Wikipedia:

W kodowaniu Unicode, wszystkie znaki interpunkcyjne nie są zapisywane w kolejności zapisu. Oznacza to, że kierunek pisania znaków jest zapisany w znakach. W takim przypadku postać nazywa się "silna". Znaki interpunkcyjne mogą jednak pojawiać się zarówno w skryptach LTR, jak i RTL. Są one nazywane "słabymi", ponieważ nie zawierają żadnych informacji kierunkowych. Zatem to od oprogramowania zależy, w którym kierunku zostaną umieszczone te "słabe" znaki. Czasami (w tekstach mieszanych) prowadzi to do błędów wyświetlania, spowodowanych przez bidi-algorytm, który przebiega przez tekst i identyfikuje silne znaki LTR i RTL i przypisuje kierunek słabym znakom, zgodnie z regułami algorytmu.

W algorytmie każda sekwencja połączonych silnych znaków nazywana jest "biegiem". Słaba postać umieszczona między dwoma silnymi postaciami o tej samej orientacji odziedziczy ich orientację. Słaby znak, który znajduje się pomiędzy dwoma silnymi znakami z innym kierunkiem zapisu, dziedziczy kierunek pisania głównego kontekstu (w dokumencie LTR postać stanie się LTR, w dokumencie RTL stanie się RTL). Jeśli po "słabym" znaku występuje inny "słaby" znak, algorytm przyjrzy się pierwszej sąsiedniej "silnej" postaci. Czasami prowadzi to do niezamierzonych błędów wyświetlania. Błędy te są korygowane lub blokowane przez "pseudo-silne" znaki. Takie znaki sterujące Unicode są nazywane znaków. Znak U + 200E (od lewej do prawej) lub U + 200F (od prawej do lewej) ma zostać wstawiony w miejsce, aby załączony słaby znak dziedziczył jego kierunek zapisu.

Na przykład, aby poprawnie wyświetlić znak towarowy U + 2122 ™ dla angielskiej marki (LTR) w arabskim (RTL) przejściu, znak LRM jest wstawiany po symbolu znaku towarowego, jeśli symbol nie jest przestrzegany według tekstu LTR. Jeżeli znak LRM nie zostanie dodany, słaba postać ™ będzie otoczona silnym znakiem LTR i silnym znakiem RTL. Dlatego w kontekście RTL będzie traktowany jako RTL i wyświetlany w nieprawidłowej kolejności.

Więc rozwiązaniem jest dodanie U + 200E lewej do prawej znak po symboli walut prawej do lewej:

string rialSymbol = "\ufdfc\u200e"; 
string amount = "123.45"; 
string description = "Rials"; 
string plainConcat = rialSymbol + " " + amount + " " + description; 
Debug.WriteLine(plainConcat); 
+0

Dziękuję bardzo! Dokładnie to, czego potrzebowałem. – DMG

+0

+1 Wow, skąd to się wzięło ?! Niesamowite ... – Aliostad

+0

Znalazłem szczegóły algorytmu BiDi tutaj: http://www.unicode.org/reports/tr9/ – DMG