I am having a hard time understanding unicode sorting order.
When I run Collator.getInstance(Locale.ENGLISH).compare(\"_\", \"#\") under ICU4J 55.1 I get a
Converting Mark Ransom's comments into an answer:
_ is 005F ; [*020B.0020.0002] # LOW LINE while # is 0023 ; [*0391.0020.0002] # NUMBER SIGN. Note that the collation numbers for _ are lower than the numbers for #.