NBSP: Der falsche Space in ABAP

NBSP: Der falsche Space in ABAP

Veröffentlicht am 19. Juli 2024 von

Jörg Brandeis

| ABAP |

Im DSAG Forum ist gerade eine Frage aufgetaucht, die ich hier mal in aller Öffentlichkeit und für Google auffindbar beantworten möchte. Das Problem tritt sicherlich öfter auf.

"Ich habe in einer internen Tabelle in den Zeilen einen Inhalt, der mir im Debugger hexadezimal mit A000 angezeigt wird. Die Tabelle wird über den Funktionsbaustein TEXT_CONVERT_XLS_TO_SAP erzeugt / hochgeladen... Was bedeutet dieser Hex-Code? Gibt es noch ähnliche... Im ABAP-Programm werden mehrere Zellen per Concatentate zusammengebastelt (Akademischer Grad, Vorname und Nachname). Wenn der Akademische Grad diesen Wert (A000) hat, woher kommt der... Welche Werte könnte man evtl. durch space austauschen und wie....."

Frage aus dem DSAG Forum

Der große und der kleine Endian

Wenn man nach A000 in Unicode Tabellen sucht, so findet nur ein Zeichen "ꀀ", das man nicht erwarten würde. Das liegt an dem Little- & Big-Endian Problem, siehe Wikipedia Byte-Reihenfolge. Ich hatte wirklich gehofft, dass man damit im Jahre 2024 nichts mehr zu tun haben wird. Da hab ich mich wohl getäuscht.

Ein unsichtbarer Bösewicht

Tatsächlich muss man die Bytes umdrehen, so dass daraus 00A0 wird. Dann handelt sich hierbei um ein No Break Space aka. NBSP. Das wird gerne verwendet, wenn man einen Zeilenumbruch im HTML verhindern will. Sieht aus wie ein Space, der aber im SAP immer wieder Probleme bereitet. Im BW hatte ich schon viel Spaß mit dem Ding, siehe auch mein Artikel über die nicht erlaubten Zeichen im BW

Im Debugger validieren

Da man in Eclipse den NBSP nicht eingeben kann, musste ich im Debugger den Wert einer Variable setzen und mir diese dann im HEX-Modus anzeigen lassen:

Das ist der Bösewicht!

Hier sieht man schön, dass es sich um das gesuchte A000 handelt.

Und jetzt Suchen/Ersetzen

Mit den ABAP-Funktion REPLACE kann man den Störenfried ganz schnell durch ein anständiges Leerzeichen ersetzen.

    data(cleaned) = replace( pcre = '\x{00A0}'
                             val = strg
                             with = ` `
                             occ   =   0 ).

Hier der NBSP mitten im String...

Und hier ersetzt durch ein Space

Ich hoffe, das hilft.

Viele Grüße & ein schönes Wochenende,

Jörg