2017-10-21 4 views
1

Ich habe eine Datenbank in SQL Server mit Sammlung Arabic_CI_AS und ich brauche einige String-Daten mit einer anderen Postgres Datenbank mit Utf8 Zeichensatz zu vergleichen. Auch ich benutze C# für konvertieren & vergleichen. Es erfolgt einfach, wenn Zeichenfolge nur ein Wort enthält (in diesen Fällen sollte ich nur ersetzen ‚ي‘ auf ‚ی‘), aber für lange Schnur besondere mit ‚(‘ charachter hat Problem.Arabic_CI_AS auf UTF8 in C#

Ich kann es tun! ich versuche, einige vorgeschlagene Lösung wie:

var enc = Encoding.GetEncoding(1256); 
byte[] encBytes = enc.GetBytes(customer.name); 
customer.name = Encoding.UTF8.GetString(encBytes, 0, encBytes.Length); 

oder:

SELECT cast (name as nvarchar) as NewName 
from Customer 

Aber sie arbeiten nicht Kann mir jemand helfen


!?

Beispiel für Ein- und Ausgang, siehe Tooltips auf der rechten Seite:

My input & out put is like this

+0

"Sie funktionieren nicht" ist zu vage, so dass es nicht möglich ist, Ihnen zu helfen. Könnten Sie genaue Beispiele für Eingabe und Ausgabe geben (bearbeiten Sie die Frage). – miroxlav

+0

Eingabe: (نماينده اراک) آآاي قاسمي Ausgabe: (??????? ????) ???? ????? –

Antwort

0

vielleicht das Sie Ihre Zusammenstellung dynamisch

SELECT name collate SQL_Latin1_General_CP1_CI_AS 
from Customer 

oder

SELECT name collate Persian_100_CI_AI 
    from Customer 

ändern helfen kann oder können Sie dies in C# Seite

0 versuchen
string _Value=string.Empty; 
byte[] enBuff= Encoding.GetEncoding("windows-1256").GetBytes(customer.name); 
customer.name= Encoding.GetEncoding("windows-1252").GetString(enBuff); 

können Sie auch eine andere Sortierungen wählen. sollten Sie viele Sortierfolgen und Kodierungsnummern ändern, um gewünschte Ergebnisse zu erhalten.

+0

Danke, aber das macht den String schlechter, alle Zeichen ändern sich zu '?' Charakter –

+0

Ich versuche alle von ihnen, das letzte Ergebnis ist: (äãÇíäÏå ÇÑÇ~) ÞÇí ÞÇÓãí –

+0

@zahrakhoobi - Wenn Sie sie im hexadezimalen Editor überprüfen (lassen Sie uns nur Text in Klammern '(نماينده اراک)') überprüfen, sollten sie wie sein: 28 das ist '(' und dann D9 86 D9 85 D8 A7 D9 8A D9 86 D8 AF usw. Könnten Sie Ihre Ausgabe in hexadezimaler Form überprüfen? Dies verhindert mögliche Anzeigeprobleme bei der Interpretation der Ausgabe. – miroxlav

0

SQL Server unterstützt utf-8 Zeichenfolgen nicht. Wenn Sie mit anderen Zeichen als plain-latin umgehen müssen, wird dringend empfohlen, NVARCHAR anstelle von VARCHAR mit einer arabischen Sortierung zu verwenden.

Viele Leute denken, dass NVARCHARutf-16 ist, während VARCHARutf-8 ist. Das ist nicht wahr! Die zweite ist erweitertes ASCII und verwendet in jedem Fall 1 Byte, während utf-8 einige Zeichen mit mehr als einem Byte codiert.

Also - die wichtigste Frage ist: WARUM?

SQL Server die Zeichenfolge in eine NVARCHAR Variable annehmen kann, muss er in einem Kette von Bytes und es in die ehemalige Zeichenfolge wieder Stimmen:

DECLARE @str NVARCHAR(MAX)=N'(نماینده اراک)'; 

SELECT @str 
     ,CAST(@str AS VARBINARY(MAX)) 
     ,CAST(CAST(@str AS VARBINARY(MAX)) AS NVARCHAR(MAX)); 

Das Problem mit dem ) ist - sehr wahrscheinlich ! - dass Ihre arabischen Buchstaben von rechts nach links sind, während die )von links nach rechts ist. Ich wollte das Ergebnis der Abfrage oben in diese Antwort einfügen, schaffte es aber nicht, den abschließenden ) an den ursprünglichen Ort zu bringen ...Sie versuchen zu bearbeiten, zu löschen, zu ersetzen, aber Sie bekommen etwas anderes ... Irgendwie lustig, aber nicht eine Frage der schlechten Codierung aber einer der fehlerhaften Editoren ...

Egal, SQL-Server ist nicht Ihr Problem. Sie müssen die Zeichenfolge als NVARCHAR aus SQL-Server lesen. C# arbeitet mit Unicode-Strings und nicht mit einer kollationierten 1-Byte-Zeichenfolge. Jede Umwandlung hat die Chance, deinen Text zu zerstören.

Wenn Ihr Ziel (oder der Tooltip Sie uns zeigen) nicht in der Lage ist, die Zeichenfolge richtig zu zeigen, könnte es vollkommen in Ordnung, aber der Editor nicht ...

Wenn Sie eine solche UTF-8 passieren String zurück zu SQL-Server, erhalten Sie eine Sauerei ...

Der einzige Ort, wo UTF-8 sinnvoll ist, wird in eine Datei geschrieben oder über kleine Band übertragen. Wenn ein Text sehr viele einfache lateinische Zeichen und nur ein paar seltsame Buchstaben (wie oft XML, HTML) enthält, können Sie ziemlich viel Speicherplatz oder Band mit speichern. Mit einem fernöstlichen Text würden Sie sogar Ihren Text aufblähen. Einige dieser Zeichen benötigen 3 oder sogar 4 Bytes, um codiert zu werden.

Innerhalb Ihrer Datenbank und Anwendung sollten Sie mit Unicode bleiben.