Umwandeln string <-> xstring OHNE Codepagekonvertierung

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Umwandeln string <-> xstring OHNE Codepagekonvertierung

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
hi.

Jetzt hab ich mal wieder eine Frage an die Experten:
Gibt es einen "ähnlichen" Mechanismus wie CASTING TYPE X auch für string bzw. xstring?

Hintergrund:
Wir stellen grade auf UNICODE um und ich baue dafür einen Konverter der zwischen zwei verschiedenen Codepages übersetzen kann, wovon aber keine der Systemcodepage entspricht. Dafür bietet SAP die Klasse CL_ABAP_CONV_X2X_CE an, die aber (wie erwartet) nur mit xstring arbeiten kann. Ich brauche also nun etwas, das mir den string in einen xstring umwandelt ohne gleichzeitig die codepage umzusetzen. Würde ich die Klassen CL_ABAP_CONV_IN_CE und CL_ABAP_CONV_OUT_CE verwenden, bekomme ich z.B. bei der Umwandlung eines Euro Zeichens (€) von 1160 (Windows 1250) auf 1100 (ISO-8859-1) eine Exception, weil es das Zeichen in diesem Zeichensatz nicht gibt.

Ich suche also etwas, dass mir einen STRING in seine HEX-Darstellung konvertiert und umgekehrt, ähnlich wie es im Debugger funktioniert.
Natürlich könnte ich Zeichen für Zeichen mit ASSIGN ... CASTING TYPE X umwandeln, aber diesen Weg will ich (noch) nicht gehen.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

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


Re: Umwandeln string <-> xstring OHNE Codepagekonvertierung

Beitrag von edwin (Specialist / 302 / 10 / 68 ) »
Hi,
versuche mal den :

Code: Alles auswählen.

CL_BCS_CONVERT=>STRING_TO_XSTRING(  IV_CONVERT_CP = '   '  .... )
IV_CONVERT_CP = ' '-> es wird direkt CHAR -> HEX umwandlung vorgenommen durch Import/Export to/from data buffer

Code: Alles auswählen.

        export p = iv_string to data buffer lv_xbuf.
        import p = ev_xstring from data buffer lv_xbuf
               in char-to-hex mode.
aus der Hilfe:
".. IN CHAR-TO-HEX MODE The contents of the source fields are not converted to the code page of the target system, and are left unconverted and passed to the target fields instead. "

/Edwin

Folgende Benutzer bedankten sich beim Autor edwin für den Beitrag:
a-dead-trousers


Re: Umwandeln string <-> xstring OHNE Codepagekonvertierung

Beitrag von Legxis (Specialist / 160 / 90 / 28 ) »
Hilft der Vergleich vielleicht?

Code: Alles auswählen.

DATA: lr_conv TYPE REF TO cl_abap_conv_out_ce,
      h_string TYPE string,
      h_xstring TYPE xstring.

h_string = 'A-!-"-§-$-%-&-/-(-)-=-?-`-€'.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    text   = h_string
  IMPORTING
    buffer = h_xstring
  EXCEPTIONS
    failed = 1
    OTHERS = 2.

WRITE :/ 'String: ', h_string.
WRITE :/ 'xstring mit SCMS_STRING_TO_XSTRING: ', h_xstring.
CLEAR h_xstring.

lr_conv = cl_abap_conv_out_ce=>create( ).

TRY.
    CALL METHOD lr_conv->write
      EXPORTING
        data = h_string.

  CATCH cx_sy_codepage_converter_init.
    MESSAGE 'Fehler cx_sy_codepage_converter_init' TYPE 'I'.
  CATCH cx_sy_conversion_codepage.
    MESSAGE 'Fehler cx_sy_conversion_codepage' TYPE 'I'.
  CATCH cx_parameter_invalid_type.
    MESSAGE 'Fehler cx_parameter_invalid_type' TYPE 'I'.
  CATCH cx_parameter_invalid_range.
    MESSAGE 'Fehler cx_parameter_invalid_range' TYPE 'I'.
ENDTRY.

TRY.
    CALL METHOD lr_conv->get_buffer
      RECEIVING
        buffer = h_xstring.

  CATCH cx_root.
    MESSAGE 'Fehler cx_root' TYPE 'I'.
ENDTRY.

WRITE :/ '   xstring mit cl_abap_conv_out_ce: ', h_xstring.
CLEAR h_xstring.

TRY.
    CALL METHOD cl_bcs_convert=>string_to_xstring(
        EXPORTING
*       iv_add_bom = ''
*       iv_codepage = ''
        iv_convert_cp = ''
        iv_string = h_string
        RECEIVING
        ev_xstring = h_xstring ).
  CATCH cx_bcs.
    MESSAGE 'Fehler cx_bcs' TYPE 'I'.
ENDTRY.

WRITE :/ '        xstring mit cl_bcs_convert: ', h_xstring.

Folgende Benutzer bedankten sich beim Autor Legxis für den Beitrag:
a-dead-trousers

( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support/enhancement packages )

Re: Umwandeln string <-> xstring OHNE Codepagekonvertierung

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
@edwin: Vielen, vielen Dank. Genau das hab ich gesucht. Die BCS-Klassen hab ich bislang nur bei Emails verwendet und hatte sie daher nicht auf meinem Radar.
@Legxis: Dir auch Danke, aber die meisten deiner Vorschläge machen (intern) eine Codepagekonvertierung.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Umwandeln string <-> xstring OHNE Codepagekonvertierung

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Mist, doch noch nicht gelöst:
Genau der "Rückweg" also von XSTRING nach STRING hat in der BCS-Klasse wieder die Codepagekonvertierung drinnen :cry:
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Umwandeln string <-> xstring OHNE Codepagekonvertierung

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Nach langer, fruchtloser Suche, habe ich mich zu folgender Lösung entschieden:

Code: Alles auswählen.

class ZCL_BYTE_CONVERT definition public create public.

public section.
  class-methods FROM_CSEQUENCE_TO_XSTRING
    importing
      !ID_CSEQUENCE type CSEQUENCE
    returning
      value(RD_XSTRING) type XSTRING .
  class-methods FROM_XSEQUENCE_TO_CSTRING
    importing
      !ID_XSEQUENCE type XSEQUENCE
    returning
      value(RD_CSTRING) type STRING .
ENDCLASS.

CLASS ZCL_BYTE_CONVERT IMPLEMENTATION.
  METHOD FROM_CSEQUENCE_TO_XSTRING.

    DATA:
      ld_offset    TYPE i,
      ld_increment TYPE i,
      ld_length    TYPE i,
      ld_buffer    TYPE c LENGTH 100.

    FIELD-SYMBOLS:
      <la_buffer> TYPE any.

    CLEAR rd_xstring.

    IF id_csequence IS INITIAL.
      RETURN.
    ENDIF.

    ld_length = strlen( id_csequence ).
    CLEAR ld_offset.
    DESCRIBE FIELD ld_buffer LENGTH ld_increment IN CHARACTER MODE.

    ASSIGN ld_buffer TO <la_buffer> CASTING TYPE x.

    WHILE ld_length GE ( ld_offset + ld_increment ).
      ld_buffer = id_csequence+ld_offset(ld_increment).
      CONCATENATE rd_xstring <la_buffer> INTO rd_xstring IN BYTE MODE.
      ADD ld_increment TO ld_offset.
    ENDWHILE.

    IF ld_length GT ( ld_offset ).
      ld_buffer = id_csequence+ld_offset.
      ld_length = strlen( id_csequence+ld_offset ).
      ld_increment = ld_length * cl_abap_char_utilities=>charsize.
      CONCATENATE rd_xstring <la_buffer>(ld_increment) INTO rd_xstring IN BYTE MODE.
    ENDIF.

  ENDMETHOD.

  METHOD from_xsequence_to_cstring.

    DATA:
      ld_offset    TYPE i,
      ld_increment TYPE i,
      ld_length    TYPE i,
      ld_buffer    TYPE c LENGTH 100.

    FIELD-SYMBOLS:
      <la_buffer> TYPE any.

    CLEAR rd_cstring.

    IF id_xsequence IS INITIAL.
      RETURN.
    ENDIF.

    ld_length = xstrlen( id_xsequence ).
    CLEAR ld_offset.
    DESCRIBE FIELD ld_buffer LENGTH ld_increment IN BYTE MODE.

    ASSIGN ld_buffer TO <la_buffer> CASTING TYPE x.

    WHILE ld_length GE ( ld_offset + ld_increment ).
      <la_buffer> = id_xsequence+ld_offset(ld_increment).
      CONCATENATE rd_cstring ld_buffer INTO rd_cstring RESPECTING BLANKS.
      ADD ld_increment TO ld_offset.
    ENDWHILE.

    IF ld_length GT ld_offset.
      <la_buffer> = id_xsequence+ld_offset.
      ld_length = xstrlen( id_xsequence+ld_offset ).
      ld_increment = ld_length DIV cl_abap_char_utilities=>charsize.
* Beim Umwandeln von SBC auf DBC kann die Byte-Länge ungerade sein und somit würde das letzte Zeichen abgeschnitten werden.
      IF ld_length MOD cl_abap_char_utilities=>charsize NE 0.
        ADD 1 TO ld_increment.
* Sonderbehandlung damit beim Umwandeln kein Null-Zeichen am String-Ende übrigbleibt.
        <la_buffer>+ld_length(1) = '20'.
      ENDIF.
      CONCATENATE rd_cstring ld_buffer(ld_increment) INTO rd_cstring RESPECTING BLANKS.
    ENDIF.

  ENDMETHOD.
ENDCLASS.
Natürlich könnte ich auch die Variante aus CL_BCS_CONVERT=>STRING_TO_XSTRING verwenden, aber die Hilfe zum Zusatz IN CHAR-TO-HEX MODE besagt, dass das eigentlich nur für "temporäre Programm" gedacht ist.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Legxis

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

1
Antw.
4723
Views
String -> XString umwandeln
von Kristian » 28.04.2005 09:16 • Verfasst in Basis
0
Antw.
1138
Views
Umwandeln eines XSTRING in STRING
von Kaiwalker » 08.08.2006 09:13 • Verfasst in ABAP® Core
0
Antw.
1537
Views
pdf (MIME-Objekt) in XSTRING umwandeln?
von Jan-Ole » 17.01.2006 07:55 • Verfasst in ABAP® Core
5
Antw.
5805
Views
String in Soli-Tabelle umwandeln
von gs3rr4 » 10.03.2017 15:28 • Verfasst in ABAP® für Anfänger
0
Antw.
4725
Views
Datum umwandeln von java.sql.Date in String
von Challana » 22.08.2007 14:27 • Verfasst in Java & SAP®

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Daten an Tabelle binden
vor 8 Stunden von Bright4.5 1 / 163
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 1805
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8408