Unicode-Umstellung: Codepages

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
6 Beiträge • Seite 1 von 1
6 Beiträge Seite 1 von 1

Unicode-Umstellung: Codepages

Beitrag von neXXus (ForumUser / 4 / 0 / 0 ) »
Hallo,

wir sind dabei, unser System für Unicode fit zu machen (ECC 6.0). Das bedeutet unter anderem, dass alle TRANSLATE-Befehle für die Umsetzung von Codepages durch die von SAP zur Verfügung gestellten Klassen ersetzt werden müssen.

Leider funktioniert das nur teilweise, ich habe mit ABAP UNIT einige Tests geschrieben (ein String mit allen 256 Zeichen). Diesen konvertiere ich einmal mit dem Translate-Befehl und eimal mit der Konvertierungsklasse (natürlich zwei verschieden Variablen mit dem selben Anfangswert). Probleme bereitet das Zeichen mit dem HEX-Wert 1C (ein File-Separator laut Wikipedia).

Beim Translate-Befehl von 1100 nach 1160 wird daraus ein Punkt (x2E), bei 1100 nach 4110 wird es  (xEFA3BF). Die Klasse CL_ABAP_CONV_OUT_CE gibt aber beide Male wieder 1C zurück, egal bei welcher Codepage-Variante... Kann sich jemand vorstellen, wieso das so ist und was man da machen könnte?

Noch übler sieht das bei Strukturen aus, dort wird von der Konvertierungsklasse vieles einfach mit Punkt ersetzt, während aus dem Translate-Befehl Sonderzeichen kommen.. Die Länge des zu übersetzenden Objekts scheint auch eine Rolle zu spielen: String mit länge 256 funktioniert korrekt (abgesehen von den oben beschriebenen Ausnahmen), ein Feld mit Typ C und Länge 256 wird völlig falsch umgewandelt...

Kann mir hier jemand weiterhelfen? Für zusätzliche Infos einfach nachfragen :)
Danke & LG
Max

[EDIT]
Der TRANSLATE-Befehl verhält sich echt ziemlich komisch, Beispiel Konvertierung von 0500 nach 1100, Fokus auf das Zeichen D (x44):
  • String mit allen Zeichen: D --> . (x2E)
  • Beliebige Struktur, die eine Komponente STATUS vom Typ C Länge 1 enthält: D --> à (xE0)
  • Translate Befehl nur auf die einzelne Komponente (TRANSLATE struc-status from...): D --> ¸ (xB8, kein Komma, irgendwas anderes) <-- hat sich erledigt, Fehler meinerseits... :oops:
Währenddessen gibt CL_ABAP_CONV_IN_CE für alle Varianten brav den Punkt (x2E) zurück... was ist da los?!

Selbiges gilt auch für viele andere Zeichen.
LG
Zuletzt geändert von neXXus am 23.09.2013 14:29, insgesamt 1-mal geändert.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Unicode-Umstellung: Codepages

Beitrag von zzcpak (Expert / 673 / 5 / 68 ) »
könntest du mal ein Beispiel zeigen, wie du CL_ABAP_CONV_OUT_CE verwendest?
Wie wird Parameter Endian versorgt?
Welches Betriebssystem habt ihr?

Re: Unicode-Umstellung: Codepages

Beitrag von neXXus (ForumUser / 4 / 0 / 0 ) »
Hi,
ich verwende CL_ABAP_CONV_IN_CE für die Konvertierung von 0500 nach 1100... Hier der Teil meiner Hilfsmethode, die von einem Fremdzeichensatz in den Systemzeichensatz konvertieren soll:

Code: Alles auswählen.

DATA: length    TYPE i,
	buffer    TYPE xstring,

	data      TYPE REF TO data,
	view      TYPE REF TO cl_abap_view_offlen,
	conv_out  TYPE REF TO cl_abap_conv_out_ce,
	conv_in   TYPE REF TO cl_abap_conv_in_ce,

	exc       TYPE REF TO cx_root.

FIELD-SYMBOLS: 	<xlike>  TYPE x,
		<clike>  TYPE c.

TRY.
  view = cl_abap_view_offlen=>create_legacy_view( value ).
CATCH cx_parameter_invalid_type.
ENDTRY.

conv_in = cl_abap_conv_in_ce=>create( encoding    = fr_codepage
					  endian      = endian
					  replacement = replacement
					  ignore_cerr = ignore_cerr ).

IF view IS BOUND.

 ASSIGN value TO <xlike> CASTING.
 conv_in->convert_struc( EXPORTING input = <xlike> view = view IMPORTING data = value ).

ELSE.

 length = STRLEN( value ).
 CREATE DATA data TYPE c LENGTH length.
 ASSIGN data->* TO <clike>.
 <clike> = value.
 ASSIGN <clike> TO <xlike> CASTING.
 conv_in->convert( EXPORTING input = <xlike> IMPORTING data = value ).

ENDIF.
fr_codepage enthält in diesem Beispiel 0500, die weiteren Parameter sind Defaultmässig mit Endian = 'B', replacement = '.' und ignore_cerr = abap_true belegt... value ist der CHANGING-Parameter vom Typ ANY welcher umgesetzt werden soll.
Wir haben ein HP Unix-Betriebssystem, welches sehe ich leider gerade nicht im Status.. DB System ist Oracle.
Danke für deine Antwort

Re: Unicode-Umstellung: Codepages

Beitrag von zzcpak (Expert / 673 / 5 / 68 ) »
bin mir jetzt alles andere als sicher, aber probier doch mal it

WRITE / cl_abap_char_utilities=>endian.

herauszufinden, ob bei euch hier 'B' für Big Endian oder 'L' für Little Endian rauskommt.

je nach Ergebnis versuche die CL_ABAP_CONV* Klassen dann entsprechend aufrufen.

Wenn mich nicht alles täuscht, kannst du dir die Konvertierung bei Big Endian sparen und gleich mit ASSIGN ... CASTING zuweisen.

Habe das bisher nur einmal benötigt, um Rohdaten (XSTRING) im LE-Format nach STRING zu konvertieren.

Re: Unicode-Umstellung: Codepages

Beitrag von neXXus (ForumUser / 4 / 0 / 0 ) »
Danke für den Tipp, aber ich fürchte so leicht komme ich nicht davon...
Unser Endian ist B, aber ein einfacher ASSIGN führt keine Codepage-Konvertierung aus.
Schau mal in den angehängten Screenshot:
Das Problem ist, dass der TRANSLATE Befehl in Strukturen (bzw. in Feldern vom Typ C mit fester Länge) anders zu funktionieren scheint als in Strings. Das kann man im Bild sehr gut sehen. Das kommt mir sehr merkwürdig vor... Und die Konvertierungsklassen von SAP geben den Wert immer so zurück, wie es der TRANSLATE Befehl bei einem String machen würde (vermutlich weil eine mitgegebene Struktur sowieso in einen Binär-String umgewandelt wird).

Wenn man versucht, wieder zurück zu übersetzen, dann kommt nur die mit TRANSLATE übersetzte Struktur wieder so wie am Anfang raus, die drei anderen sind falsch. Irgendetwas ist da faul beim Überstzen von Strings, und von Strukturen mit den empfohlenen Klassen. Und interessanterweise ist das nicht bei allen Codepages so; mit 1160 und 4110 z.B. funktioniert es überall richtig.

Ich bin echt ratlos, ich brauche eine Unicode-fähige Methode, die das gleiche Resulat liefert wie der alte TRANSLATE-Befehl. Wie kann es denn sein, dass SAP Klassen als Alternative vorschlägt, welche nicht richtig funktionieren? Wenn ich ignore_cerr abschalte, wird eine Exception geworfen mit dem Text: "Zeichensatzkonvertierung für ein oder mehrere Zeichen nicht möglich." Aber der TRANSLATE kanns doch..

Hier noch die gesamte Hilfsmethode:

Code: Alles auswählen.

method translate_codepage.

  data: length    type i,
        buffer    type xstring,

        data      type ref to data,
        view      type ref to cl_abap_view_offlen,
        conv_out  type ref to cl_abap_conv_out_ce,
        conv_in   type ref to cl_abap_conv_in_ce,

        exc       type ref to cx_root.

  field-symbols: <xlike>  type x,
                 <clike>  type c.

  try.

      try.
          view = cl_abap_view_offlen=>create_legacy_view( value ).
        catch cx_parameter_invalid_type.
      endtry.

      if fr_codepage = '1100'.

        conv_out = cl_abap_conv_out_ce=>create( encoding     = to_codepage
                                                endian       = endian
                                                replacement  = replacement
                                                ignore_cerr  = ignore_cerr ).

        conv_out->write( data = value view = view ).
        buffer = conv_out->get_buffer( ).

        length = xstrlen( buffer ).
        create data data type x length length.
        assign data->* to <xlike> casting.

        <xlike> = buffer.
        assign <xlike> to <clike> casting.

        string_to_struc( exporting iv_string = <clike> importing es_struc = value ).

      elseif to_codepage = '1100'.

        conv_in = cl_abap_conv_in_ce=>create( encoding    = fr_codepage
                                              endian      = endian
                                              replacement = replacement
                                              ignore_cerr = ignore_cerr ).

        if view is bound.

          assign value to <xlike> casting.
          conv_in->convert_struc( exporting input = <xlike> view = view importing data = value ).

        else.

          length = strlen( value ).
          create data data type c length length.
          assign data->* to <clike>.
          <clike> = value.
          assign <clike> to <xlike> casting.
          conv_in->convert( exporting input = <xlike> importing data = value ).

        endif.

      endif.

    catch cx_root into exc.

      err_msg = exc->get_text( ).

      clear value.
      exit.

  endtry.

endmethod.

Re: Unicode-Umstellung: Codepages

Beitrag von neXXus (ForumUser / 4 / 0 / 0 ) »
Dateianhänge hochladen funktioniert wohl gerade nicht :/
es ist dieser code:

Code: Alles auswählen.

  DATA: cp_fr TYPE abap_encod,
        cp_to TYPE abap_encod.

  DATA: BEGIN OF text_old,
    word1 TYPE c LENGTH 4 VALUE 'AAAA',
    word2 TYPE c LENGTH 4 VALUE 'BBBB',
    word3 TYPE c LENGTH 4 VALUE 'CCCC',
    word4 TYPE c LENGTH 4 VALUE 'DDDD',
  END OF text_old,
  test_string_old TYPE string VALUE 'AAAABBBBCCCCDDDD',

  text_new LIKE text_old,
  test_string_new TYPE string.

  cp_fr = '0500'.
  cp_to = '1100'.

  text_new = text_old.
  test_string_new = test_string_old.

  TRANSLATE test_string_old FROM CODE PAGE cp_fr TO CODE PAGE cp_to.

  TRANSLATE text_old FROM CODE PAGE cp_fr TO CODE PAGE cp_to.

  zecl_conv_utilities=>translate_codepage(
    EXPORTING
      fr_codepage = cp_fr
      to_codepage = cp_to
*      ignore_cerr = abap_false
    IMPORTING
      err_msg = error
    CHANGING
      value = test_string_new
    ).

  zecl_conv_utilities=>translate_codepage(
    EXPORTING
      fr_codepage = cp_fr
      to_codepage = cp_to
*      ignore_cerr = abap_false
    IMPORTING
      err_msg = error
    CHANGING
      value = text_new
    ).
und damit erhalte ich diese Resultate:
TEXT_OLD = '    ââââääääàààà'
TEST_STRING_OLD = '    ............'
TEXT_NEW = '    ............
TEST_STRING_NEW = '    ............'

Seite 1 von 1

Vergleichbare Themen

2
Antw.
4794
Views
Unicode-Umstellung
von ralf.wenzel » 06.03.2007 10:06 • Verfasst in ABAP® Core
3
Antw.
1970
Views
mySAP ERP und Umstellung auf UNICODE
von ta » 19.01.2006 09:22 • Verfasst in Basis
1
Antw.
6362
Views
Unicode-Umstellung mit Syntaxfehler
von Kristin » 17.12.2008 13:33 • Verfasst in SAP - Allgemeines
3
Antw.
2789
Views
Error XML Parser. Nach Unicode Umstellung
von isp » 05.09.2018 11:45 • Verfasst in ABAP® Core
8
Antw.
4966
Views
Umstellung Unicode - Zuweisung gepackter Felder
von gutzeli » 18.10.2012 08:06 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2416
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9006