J'ai une application Java qui reçoit des données sur un socket en utilisant un InputStreamReader
. Il rend compte de « Cp1252 » de sa méthode getEncoding
:Comment spécifier une valeur de file.encoding Java cohérente avec la page de code Windows sous-jacente?
/* java.net. */ Socket Sock = ...;
InputStreamReader is = new InputStreamReader(Sock.getInputStream());
System.out.println("Character encoding = " + is.getEncoding());
// Prints "Character encoding = Cp1252"
qui ne correspond pas nécessairement ce que les rapports du système comme la page de code. Par exemple:
C:\>chcp Active code page: 850
L'application peut recevoir octet 0x81, qui code page 850 représente le caractère ü
. Le programme interprète cet octet avec la page de code 1252, qui ne définit aucun caractère à cette valeur, donc j'obtiens un point d'interrogation à la place.
j'ai pu contourner ce problème pour un client qui a utilisé la page de code 850 en ajoutant une autre option de ligne de commande dans le fichier batch qui lance l'application:
java.exe -Dfile.encoding=Cp850 ...
Mais pas tous mes clients utilisent le code page 850, bien sûr. Comment puis-je obtenir Java pour utiliser une page de code compatible avec le système Windows sous-jacent? Ma préférence serait quelque chose que je pouvais mettre dans le fichier de commandes, laissant le code Java intact:
ENC=... java.exe -Dfile.encoding=%ENC% ...
+1. BTW Sur mon système Windows 7, la page de codes active est 850, mais Java signale que "Cp1252" est la propriété système "file.encoding". –
Les clients et le serveur doivent être configurés avec le même codage, quel qu'il soit pour un client donné. Une application non-Java envoie des données de caractères au serveur à l'aide de la page de codes locale, le serveur stocke les données et, plus tard, le serveur l'envoie à l'application Java. Personne ne stocke ce que la page de code est, parce que tant que tout le monde utilise le même, cela n'a pas d'importance. Le problème est que l'application Java ne coopère pas; il utilise toujours Cp1252. (La "bonne" solution consiste à changer le protocole pour forcer tout, par exemple, UTF-8, mais un changement de protocole casse toutes les installations existantes.) –
Ensuite, il semble que G_A ait votre réponse. Une autre option consiste à faire en sorte que cette application non-Java signale à votre application Java ce qu'elle pense être l'encodage, puis utilisez le constructeur approprié, comme indiqué ci-dessus. – Yishai