UTF-8 Prüfung

Getting started ... Alles für einen gelungenen Start.
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

UTF-8 Prüfung

Beitrag von NLengner (ForumUser / 31 / 7 / 2 ) »
Hallo zusammen,

wie kann ich nach dem einlesen einer ZIP-Datei (darin CSV-Datein) oder einer normalen CSV-Datei prüfen ob diese UTF-8 sind und nicht UTF-8 - BOM, etc..
Ich lade diese Dokumente nur ins Programm, nicht auf einen Applikationsserver.

Viele Grüße Nick

Mein aktueller Code dazu:

Code: Alles auswählen.

START-OF-SELECTION.
***************************************************************************************************************
*                                              Upload Datein
  lv_path_as_c = lv_path.
  TRANSLATE p_link TO UPPER CASE.

  "Hole Dateityp
  CALL FUNCTION 'TRINT_FILE_GET_EXTENSION'
    EXPORTING
      filename  = lv_path_as_c
      uppercase = 'X'
    IMPORTING
      extension = lv_zip_csv.

  CASE lv_zip_csv.
    WHEN 'ZIP' OR 'CSV'.
    WHEN OTHERS.
      MESSAGE: 'Bitte eine CSV oder ZIP Datein einfügen.' TYPE 'I' DISPLAY LIKE 'E'.
      LEAVE TO LIST-PROCESSING. EXIT.
  ENDCASE.

  "Speichern in Tabelle
  cl_gui_frontend_services=>gui_upload(
    EXPORTING
      filename                = lv_path
      filetype                = 'BIN'
      has_field_separator     = ''
      codepage                = '4110'
    IMPORTING
      filelength = lv_size
    CHANGING
      data_tab     = lt_inputtab_xstring ).

  "Übersetzen in string
  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = lv_size
    IMPORTING
      buffer       = lv_xstring_buffer
    TABLES
      binary_tab   = lt_inputtab_xstring.

  CASE lv_zip_csv.

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


Re: UTF-8 Prüfung

Beitrag von fr-g (ForumUser / 76 / 12 / 25 ) »
Sollst du nicht auf den AS schreiben? Bei ZIP-Archiven müsstest du doch irgendwohin entpacken können.
Grundsätzlich müssten dir die cl_abap_file_utilities weiterhelfen können (check_utf8, check_for_bom...).

Folgende Benutzer bedankten sich beim Autor fr-g für den Beitrag:
NLengner


Re: UTF-8 Prüfung

Beitrag von NLengner (ForumUser / 31 / 7 / 2 ) »
fr-g hat geschrieben:
14.11.2019 08:31

Grundsätzlich müssten dir die cl_abap_file_utilities weiterhelfen können (check_utf8, check_for_bom...).
Habe ich schon versucht gehabt. Aber es kommt immer zu einem Fehler.
Soweit ich es verstanden habe, gebe ich den File_Name mit und dieser File_Name wird versucht im AS zu öffnen, wo er allerdings nichts findet.
Wenn ich mir irre dann sag es mir gerne. - Habe erst vor einem Jahr mit ABAP angefangen und verstehe noch nicht alles. :)

fr-g hat geschrieben:
14.11.2019 08:31

Sollst du nicht auf den AS schreiben? Bei ZIP-Archiven müsstest du doch irgendwohin entpacken können.
Doch schon, ich wollt aber mal probieren ob es auch ohne den AS funktioniert.
Dazu nutze ich cl_abap_zip, Loop über den Inhalt der ZIP-Datei drüber und setzte mir jede CSV-Datei in jeden Durchlauf immer in ein und die selbe ITAB und arbeite dann damit weiter..

siehe code:

Code: Alles auswählen.

  CASE lv_zip_csv.
***************************************************************************************************************
*                                       Bearbeitung & upload ZIP Datei
    WHEN 'ZIP'.
      CREATE OBJECT lo_zip.
      lo_zip->load( lv_xstring_buffer ).
      LOOP AT lo_zip->files ASSIGNING FIELD-SYMBOL(<fs_zip_data>).
        lo_zip->get( EXPORTING name = <fs_zip_data>-name IMPORTING content = lv_zip_content_xstring ).
        DATA(tabname) = |PA{ <fs_zip_data>-name+2(4) }|.
        DATA(csv_data_string) = cl_bcs_convert=>xstring_to_string( iv_xstr = lv_zip_content_xstring iv_cp = '4110' ).
        SPLIT csv_data_string AT cl_abap_char_utilities=>cr_lf INTO TABLE t_csv. "AT "#"
        zcl_process=>edit_and_upload( data = t_csv table = CONV #( tabname ) ).
      ENDLOOP.
Grüße und Danke

Re: UTF-8 Prüfung

Beitrag von Daniel (Specialist / 314 / 68 / 44 ) »
In einer UTF-8 Datei sind "normale" ASCII-Zeichen
und evtl. unicodierte Zeichen.
Wenn keine unicodierten Zeichen vorkommen kann
die Datei auch als ASCII-Datei behandelt werden
obwohl es per Definition eine UTF-8-Datei ist.
Um festzustellen ob unicodierte Zeichen vorhanden
sind muss man prüfen ob es Zeichen die mit hex '11'
beginnen gibt und diese von Zeichen die mit hex '10'
gefolgt werden.

Beispielcoding:

Code: Alles auswählen.

DATA: x40(1) TYPE x VALUE '40',    " 0100 0000
      x80(1) TYPE x VALUE '80',    " 1000 0000
      xc0(1) TYPE x VALUE 'C0'.    " 1100 0000
...
      DO n TIMES.
         READ DATASET filename INTO line LENGTH sy-tfill.
         IF sy-subrc NE 0. EXIT. ENDIF.
*        Prüfe auf UTF-8
         SUBTRACT 2 FROM sy-tfill.
         DO sy-tfill TIMES.
            IF line+sy-index(1) O xc0.              " Zeichen 1 beginnt mit 11xxxxxx
               ADD 1 TO sy-index.
               IF line+sy-index(1) O x80 AND        " Zeichen 2 beginnt mit 10xxxxxx
                  line+sy-index(1) Z x40.
                  MOVE 'U' TO mode.
                  EXIT.
               ENDIF.
            ENDIF.
         ENDDO.
         IF mode EQ 'U'. EXIT. ENDIF.
      ENDDO.

Die Länge von LINE und der Wert von N beeinflussen
wie groß der Teil der Datei ist der untersucht werden
soll. Bei kleinen Dateien kann man problemlos zu 100%
prüfen, bei sehr großen Dateien genügt es oft nur die
ersten 5% zu prüfen.

Folgende Benutzer bedankten sich beim Autor Daniel für den Beitrag:
NLengner


Re: UTF-8 Prüfung

Beitrag von NLengner (ForumUser / 31 / 7 / 2 ) »
Hallo Daniel,
danke dir für deine hilfreiche Antwort.

Ich habe mich aber dann doch entschlossen gehabt den AS, somit auch "cl_abap_file_utilities=>check_utf8" zu nutzen.

siehe coding:

Code: Alles auswählen.

WHEN 'ZIP'.
      CREATE OBJECT lo_zip.
      lo_zip->load( lv_xstring_buffer ).
      LOOP AT lo_zip->files ASSIGNING FIELD-SYMBOL(<fs_zip_data>).
        lo_zip->get( EXPORTING name = <fs_zip_data>-name IMPORTING content = lv_zip_content_xstring ).
        DATA(tabname) = |PA{ <fs_zip_data>-name+2(4) }|.
        DATA(csv_data_string) = cl_bcs_convert=>xstring_to_string( iv_xstr = lv_zip_content_xstring iv_cp = '4110' ).
        DATA(lv_encoding_zip) = lo_check->check( EXPORTING i_path = lv_as_path i_string = csv_data_string ).
        CASE lv_encoding_zip.
          WHEN 'A'.
            SPLIT csv_data_string AT cl_abap_char_utilities=>cr_lf INTO TABLE t_csv. "AT "#"
            zcl_process=>edit_and_upload( data = t_csv table = CONV #( tabname ) ).
          WHEN OTHERS.
            MESSAGE: 'Die Codierung einer Datei ist nicht Korrekt.' TYPE 'I' DISPLAY LIKE 'E'.
            ROLLBACK WORK.
            LEAVE LIST-PROCESSING.
        ENDCASE.
      ENDLOOP.

Code: Alles auswählen.

  METHOD check.

    OPEN DATASET i_path FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
    TRANSFER i_string(20) TO i_path.
    CLOSE DATASET i_path.
    TRY .
        cl_abap_file_utilities=>check_utf8(
                EXPORTING
                  file_name            = i_path    " Dateiname (wie bei OPEN DATASET)
                  max_kb               = 8    " Obergrenze (Kilobyte)
                IMPORTING
                   encoding             = DATA(lv_encoding)    " Encoding (Klassenkonstante)
              ).
      CATCH cx_sy_file_open.    "
      CATCH cx_sy_file_authority.    "
      CATCH cx_sy_file_io.    "
    ENDTRY.

    r_encoding = lv_encoding.

  ENDMETHOD.

Seite 1 von 1

Vergleichbare Themen

2
Antw.
1850
Views
F4-Prüfung im ALV
von mfromg » 08.09.2017 05:03 • Verfasst in ABAP Objects®
0
Antw.
1378
Views
Prüfung
von 1337 » 19.11.2013 09:53 • Verfasst in ABAP® für Anfänger
5
Antw.
3553
Views
CRC Prüfung mit ABAP
von wummy » 22.02.2007 10:20 • Verfasst in ABAP® Core
0
Antw.
2220
Views
ATP Prüfung in der Lieferung
von unimog210 » 07.02.2009 11:05 • Verfasst in Sales and Distribution
0
Antw.
4681
Views

Ü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.