If a number or non-printable character is placed in a CHAR-variable, it will be displayed as a #.

SAP's way to say: the character could not be printed so it should be interpreted as a "number" (like #1 = number one). No problems so far, until this special character needs to be replaced by something else. Consider the following situation:

A Microsoft Write file with tabs was read into an internal table using the GUI_UPLOADĀ function module. The result was a table that looked like this:

0001  NAME#OCCUPATION#SALARY SCALE
0002
0003  Andrews#Engineer#M5
0004  Emst#Director#M12
0005  Claessens#Pilot#M11

Since the Microsoft Write file contained tabs, the # that is displayed is not really a #-character at all. The real value can be determined by doing this:

FIELD-SYMBOLS: <fs_CHAR_X> TYPE X.
data: lv_CHAR type c length 1.

* The TAB character
lv_CHAR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
ASSIGN lv_CHAR TO <fs_CHAR_X> CASTING TYPE X.
WRITE: / 'The tab character :' , <fs_CHAR_X>(1).

* The # character
lv_CHAR = '#'.
ASSIGN lv_CHAR TO <fs_CHAR_X> CASTING TYPE X.
WRITE: / 'A real # character:' , <fs_CHAR_X>(1).

The result would be something like:

The tab character : 09
A real # character: 23

So before using the REPLACE, SPLIT, TRANSLATE or string comparison operators like CA, CO or CS, make sure you're #-character is really filled with the "right" value !

The other way around: if you would like to put the TAB character in your string, here's how:

data: lv_tabulator_character.
FIELD-SYMBOLS: <fc_CHAR_X> TYPE X.

assign lv_tabulator_character TO <fc_CHAR_X> CASTING TYPE 'X'. 
move 9 to <fc_CHAR_X>. " 9 = The tabulator

Utilities for character strings in Abap Objects

When you're after more - make sure you check out the ABAP character utilities class (SE24) called CL_ABAP_CHAR_UTILITIES which also holds attributes for special characters like HORIZONTAL_TAB, VERTICAL_TAB, NEWLINE, CR_LF, FORM_FEED and BACKSPACE.