[Gelöst] BLOB Feld - Encoding/Unicode Problem

25. August 2017 13:59

Hallo,

ich habe ein Problem beim Schreiben/Lesen von Unicode Text und BLOB Feldern und befinde mich in einer NAV 2013 R2 Umgebung. Beispielhaft habe ich das mit dem Unicodezeichen U+207A (8314) gemacht, das ist das hochgestellte +
Wenn ich dieses Zeichen einem Bigtext zuweise und per Message ausgebe ist alles richtig. Wenn ich den Bixtext dann per Stream in das BLOB Feld schreibe und wieder auslese ist es leider nicht mehr richtig. Schaue ich mir den Dezimalwert vom Zeichen an, ist er nach dem Auslesen auch nicht mehr 8314 sondern 63 (entspricht dem Fragezeichen, dass sehe ich dann auch anstelle des hochgestellten +).

Hier mein Code:
Code:
charVar := 8314; // entspricht dem hochgestellten +

A.INIT;
A.RESET;
IF A.FINDFIRST THEN BEGIN

  CLEAR(bigtextVar);
  bigtextVar.ADDTEXT(FORMAT(charVar)); 
  MESSAGE(FORMAT(bigtextVar));  // es erscheint noch richtig
 
  A.Description.CREATEOUTSTREAM(OutStr,TEXTENCODING::UTF16);
  bigtextVar.WRITE(OutStr);           
  A.MODIFY;
  CLEAR(bigtextVar);

  A.CALCFIELDS(Description);
  A.Description.CREATEINSTREAM(InStr, TEXTENCODING::UTF16);
  bigtextVar.READ(InStr);
  MESSAGE(FORMAT(bigtextVar));  // es erscheint falsch
END;


Ich habe bereits versucht andere Encodings bei den Streams einzustellen, die Subtyp-Eigenschaft vom BLOB Feld auf User-defined oder Memo zu stellen und die Compresses-Eigenschaft vom BLOB Feld auf No oder Yes zu stellen. Hat alles nichts gebracht.

Hat jemand eine Idee? Wo ist mein Denkfehler bzw. wieso funktioniert das nicht?

Viele Grüße
Daniel
Zuletzt geändert von dr am 28. August 2017 11:14, insgesamt 1-mal geändert.

Re: BLOB Feld - Encoding/Unicode Problem

28. August 2017 09:47

Hi!

Warum es nicht funktioniert kann ich dir nicht sagen, aber es gibt eine Lösung.
Du musst für das Encoding und die Streams dotNet Variablen verwenden.

Anbei meine 2 Funktionen um Text in einem Blob zu speichern und aus einem Blob zu lesen:
Langtext = Blobfeld

:greenarrow: Schreiben
Code:
Name   DataType   Subtype   Length
StreamOut   OutStream      
StreamWriter   DotNet   System.IO.StreamWriter.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   
Encoding   DotNet   System.Text.Encoding.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   

Text2Blob(myText : Text)
Code:
CLEAR(Langtext);
IF myText <> '' THEN BEGIN
  Langtext.CREATEOUTSTREAM(StreamOut);
  StreamWriter := StreamWriter.StreamWriter(StreamOut,Encoding.UTF8);
  StreamWriter.Write(mytext);
  StreamWriter.Flush;
  StreamWriter.Close;
END;



:greenarrow: Lesen
Code:
Name   DataType   Subtype   Length
myText   Text      
Stream   InStream      
StreamReader   DotNet   System.IO.StreamReader.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   
Encoding   DotNet   System.Text.Encoding.'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'   

Blob2Text() : Text
Code:
CALCFIELDS(Langtext);
IF NOT Langtext.HASVALUE THEN
  EXIT('')
ELSE BEGIN
  Langtext.CREATEINSTREAM(Stream);
  StreamReader := StreamReader.StreamReader(Stream,Encoding.UTF8,true);
  myText := StreamReader.ReadToEnd;
  StreamReader.Close;
  EXIT(myText)
END;

Re: BLOB Feld - Encoding/Unicode Problem

28. August 2017 11:13

Hallo vandyke,

danke für die Antwort, ich habe diese Variante sogar selbst heute morgen gefunden und ausprobiert. Es funktioniert.
Ich werde auch nicht länger nach dem "warum" suchen, sondern bei mir alles umstellen.

Als Ergänzung noch, weil bei mir alles mit einem Excel Import beginnt:
Man kann auch den ExcelBuffer um ein Blobfeld und den Aufruf und die Funktion "ParseCellValue" erweitern, so dass die überlangen Texte aus meinem Exceldokument sauber importiert werden, wenn man auch hier die DotNet Variante verwendet.