La taille du caractère n’est-elle pas en Java 2 octets?

J’ai utilisé RandomAccessFile pour lire un byte dans un fichier texte.

 public static void readFile(RandomAccessFile fr) { byte[] cbuff = new byte[1]; fr.read(cbuff,0,1); System.out.println(new Ssortingng(cbuff)); } 

Pourquoi est-ce que je vois un personnage complet lu par ceci?

Un caractère représente un caractère en Java (*) . Il est large de 2 octets (du moins, c’est ce que suggère la plage de valeurs valides).

Cela ne signifie pas nécessairement que chaque représentation d’un caractère est longue de 2 octets. En fait, de nombreux encodages ne réservent qu’un octet pour chaque caractère (ou utilisent 1 octet pour les caractères les plus courants).

Lorsque vous appelez le constructeur Ssortingng(byte[]) vous demandez à Java de convertir l’ byte[] en une Ssortingng utilisant le codage par défaut de la plate-forme. Comme le codage par défaut de la plate-forme est généralement un codage sur un octet tel que ISO-8859-1 ou un codage de longueur variable tel que UTF-8, il peut facilement convertir cet octet en un seul caractère.

Si vous exécutez ce code sur une plate-forme utilisant UTF-16 (ou UTF-32 ou UCS-2 ou UCS-4 ou …) comme encodage par défaut de la plate-forme, vous n’obtiendrez pas de résultat valide (vous obtiendrez une Ssortingng contenant le caractère de remplacement Unicode à la place.

C’est l’une des raisons pour lesquelles vous ne devriez pas dépendre de l’encodage par défaut de la plateforme: lors de la conversion entre byte[] et char[] / Ssortingng ou entre InputStream et Reader ou entre OutputStream et Writer , vous devez toujours spécifier le codage que vous souhaitez utiliser. Si vous ne le faites pas, votre code dépendra de la plate-forme.

(*) Ce n’est pas tout à fait vrai: un caractère représente un sharepoint code UTF-16. Un ou deux points de code UTF-16 représentent un sharepoint code Unicode. Un sharepoint code Unicode représente généralement un caractère, mais parfois plusieurs points de code Unicode sont utilisés pour former un seul caractère. Mais l’approximation ci-dessus est assez proche pour discuter du sujet en question.

Java stocke tous ses “caractères” en interne sous la forme de deux octets. Cependant, lorsqu’ils deviennent des chaînes, le nombre d’octets dépendra de votre encodage.

Certains caractères (ASCII) sont à un seul octet, mais beaucoup d’autres sont multi-octets.

Java supporte Unicode, donc selon:

Documents de Java

La valeur maximale prise en charge est “\ uFFFF” (hex FFFF, dec 65535) ou 11111111 11111111 binary (deux octets).

Le constructeur Ssortingng(byte[] bytes) prend les octets du tampon et les code en caractères.

Il utilise le jeu de caractères par défaut de la plate-forme pour coder les octets en caractères. Si vous savez que votre fichier contient du texte, qui est encodé dans un autre jeu de caractères, vous pouvez utiliser la Ssortingng(byte[] bytes, Ssortingng charsetName) pour utiliser le codage correct (des octets aux caractères).

Dans un fichier texte ASCII, chaque caractère est juste un octet

On dirait que votre fichier contient des caractères ASCII, qui sont encodés en 1 octet seulement. Si le fichier texte contenait des caractères non-ASCII, par exemple UTF-8 sur 2 octets, vous obtenez uniquement le premier octet, pas le caractère entier.

Il y a quelques bonnes réponses ici mais je voulais souligner que jvm est libre de stocker une valeur de caractère dans n’importe quel espace de taille> = 2 octets.

Sur de nombreuses architectures, il existe une pénalité pour l’exécution d’un access mémoire non aligné, de sorte qu’un caractère peut facilement être ajouté à 4 octets. Un caractère volatil peut même être ajouté à la taille de la ligne de cache du processeur pour éviter un partage erroné. https://en.wikipedia.org/wiki/False_sharing

Il peut être peu intuitif pour les nouveaux programmeurs Java qu’un tableau de caractères ou une chaîne ne soit pas simplement plusieurs caractères. Vous devriez apprendre et penser distinctement aux chaînes et aux tableaux de “caractères multiples”.

Je tiens également à souligner que les personnages Java sont souvent mal utilisés. Les gens ne réalisent pas qu’ils écrivent du code qui ne traitera pas correctement les points de code sur une longueur de 16 bits.