Java utilise des caractères UTF-16. Ces caractères prennent 2 octets. Le 65503 numéro a la configuration binaire de
1111 1111 1101 1111
^ // only the 6th bit is 0
Comme vous pouvez le voir seulement le 6 bit est 0. Lorsque vous utilisez ce numéro comme bit-mask et faire une sage bits et le fonctionnement (votre char & 65503
), il tourne le 6 un peu de ce char
off (en faire un zéro). Si vous regardez le ASCII table (ASCII et Unicode sont les mêmes pour l'alphabet latin), vous verrez que ce sixième bit est la différence entre les majuscules et les majuscules (la différence de valeur est exactement 32) . Donc, si vous avez de petits caractères latins, ils deviendront des caractères majuscules. Si vous avez des majuscules, cela ne fera rien, parce que leur 6ème bit est déjà 0. Donc, fondamentalement, c'est un hack à faire àUpperCase() sur les caractères latins.
Ceci est un hack (et un mauvais code [nombre magique]). En général, l'arithmétique sur les caractères est valide dans des plages très étroites, ce qui rend la lecture souvent confuse et non extensible de façon naturelle. En outre, le véritable changement de cas doit être spécifique aux paramètres régionaux. Voir ['String toLowerCase (Locale locale)'] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toLowerCase (java.util.Locale)) –