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

Bild Microsoft Dynamics NAV 2013 (aka "NAV 7")

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

Beitragvon dr » 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: Alles auswählen
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.
Benutzeravatar
dr
Microsoft Partner
Microsoft Partner
 
Beiträge: 168
Registriert: 17. April 2008 10:17
Realer Name: Daniel
Arbeitsort: WĂĽrzburg
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: "blau" - 2016

Re: BLOB Feld - Encoding/Unicode Problem

Beitragvon Raik Zobel » 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: Alles auswählen
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: Alles auswählen
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: Alles auswählen
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: Alles auswählen
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;
Benutzeravatar
Raik Zobel
 
Beiträge: 279
Registriert: 4. März 2013 13:43
Realer Name: Raik Zobel
Arbeitsort: Leipzig
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 4.00SP3, 2013R2, 2016

Re: BLOB Feld - Encoding/Unicode Problem

Beitragvon dr » 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.
Benutzeravatar
dr
Microsoft Partner
Microsoft Partner
 
Beiträge: 168
Registriert: 17. April 2008 10:17
Realer Name: Daniel
Arbeitsort: WĂĽrzburg
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: "blau" - 2016


ZurĂĽck zu NAV 2013

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast