2010-02-03 7 views
3

J'ai une page Web qui est codée (à travers son en-tête) en tant que WIN-1255. Un programme Java crée une chaîne de texte qui est automatiquement incorporée dans la page. Le problème est que les chaînes originales sont codées en UTF-8, créant ainsi un champ de texte Gibberish dans la page.Conversion de codage de chaîne Java dans une page Web

Malheureusement, je ne peux pas changer l'encodage de la page - c'est requis par un système de propriété du client.

Des idées?

MISE À JOUR:

La page que je crée est un flux RSS qui doit être réglé sur WIN-1255, montrant des informations provenant d'un autre flux qui est codé en UTF-8.

MISE À JOUR DEUXIÈME:

Merci pour toutes les réponses. J'ai réussi à convertir la corde, et pourtant, Gibberish. Le problème était que le codage XML devait être défini en plus du codage d'en-tête.

Adam

Répondre

2

Au point, vous devez définir l'encodage de l'écrivain de réponse . Avec seulement un en-tête de réponse, vous ne faites qu'instruire l'application cliente avec le codage à utiliser pour interpréter/afficher la page. Cela ne fonctionnera pas si la réponse elle-même est écrite avec un encodage différent.

Le contexte dans lequel vous avez ce problème est tout à fait claire (s'il vous plaît donner des détails à ce sujet aussi bien dans les futurs problèmes comme celui-ci), alors voici quelques solutions:

S'il est JSP, vous devez définir les paramètres suivants dans Haut de la page JSP pour définir la réponse encoding:

<%@ page pageEncoding="WIN-1255" %> 

S'il est Servlet, vous devez définir les points suivants avant toute première chasse d'eau pour régler le codage de réponse:

response.setCharacterEncoding("WIN-1255"); 

Par ailleurs, implicitement, définissez implicitement l'en-tête de réponse Content-Type avec un paramètre charset pour indiquer au client d'utiliser le même codage pour interpréter/afficher la page. Voir aussi this article pour plus d'informations.

Si elle est une application Homegrown qui repose sur l'java.net de base et/ou java.io des API, alors vous devez écrire les caractères à travers un OutputStreamWriter qui est construit à l'aide the constructor taking 2 arguments dans laquelle vous pouvez spécifier l'encodage:

Writer writer = new OutputStreamWriter(someOutputStream, "WIN-1255"); 
0

Ce qui est l'intégration des données dans la page? Soit il devrait le lire comme du texte (en UTF-8) et ensuite l'écrire à nouveau dans l'encodage de la page web (Win-1255) ou vous devriez changer le programme Java pour créer les fichiers (ou quoi que ce soit) dans Win-1255 avec.

Si vous pouvez donner plus de détails sur le fonctionnement du système (qu'est-ce qui génère la page Web? Comment interagit-il avec le programme Java?), Les choses seront plus claires.

+0

Je souhaite vraiment que j'aurais pu faire cela, mais le problème est que je reçois la chaîne en UTF-8 et doit livrer la page entière comme un WIN-1255. Mettra à jour ma réponse. –

+0

@Adam: Que voulez-vous dire par "je reçois la chaîne en UTF-8"? Vous n'avez toujours pas expliqué comment fonctionne le système. Si vous avez une chaîne en Java avec les bonnes données, cela n'a pas forcément un encodage (ou plutôt, c'est toujours UTF-16). Mais nous ne savons pas si vous avez tout le système en Java, ou quoi ... –

+0

Désolé pour l'agitation, je vais essayer de clarifier. 1. Je sais que la représentation originale de la chaîne de caractères est censée ne pas être pertinente, mais j'ai essayé de donner un peu de contexte. 2. Le problème peut être été "Comment puis-je créer une page de flux RSS avec des chaînes WIN-1255." Merci pour l'aide. –

1

En supposant que vous avez le contrôle des cordes d'origine (correctement représentés), et doivent simplement les sortir en gagnant-1255:

import java.nio.charset.*; 
import java.nio.*; 
Charset win1255 = Charset.forName("windows-1255"); 
ByteBuffer bb = win1255.encode(someString); 
byte[] ba = new byte[bb.limit()]; 

Ensuite, écrivez simplement le contenu de ba à l'endroit approprié.

EDIT: Ce que vous faites avec ba dépend de votre environnement. Par exemple, si vous utilisez servlets, vous pourriez faire:

ServletOutputStream os = ... 
os.write(ba); 

Nous ne devons pas oublier aussi l'approche possible de faire appel setContentType("text/html; charset=windows-1255") (setContentType), puis en utilisant getWriter normalement. Vous n'avez pas précisé si Windows-1255 était défini dans une balise meta ou dans l'en-tête de réponse HTTP.

Vous avez précisé que vous avez un fichier UTF-8 à décoder. Si vous ne décodez pas correctement les chaînes UTF-8, cela ne devrait pas être grave. Il suffit de regarder InputStreamReader (someInputStream, Charset.forName ("utf-8"))

+0

Merci! Que dois-je faire maintenant avec le tableau d'octets? ba [i] est un entier, j'ai besoin d'une conversion de représentation ici. –

0

La page que je crée est un flux RSS qui doit être réglé sur WIN-1255, des informations provenant d'un autre montrant l'alimentation qui est codé en UTF-8.

Dans ce cas, utilisez un analyseur pour charger le fichier XML UTF-8. Cela devrait correctement décoder les données en données de caractères UTF-16 (les chaînes Java sont toujours UTF-16). Votre mécanisme de sortie devrait encoder de UTF-16 à Windows-1255.

0
byte[] originalUtf8;//Here input 

//utf-8 to java String: 
String internal = new String(originalUtf8,Charset.forName("utf-8"); 
//java string to w1255 String 
byte[] win1255 = internal.getBytes(Charset.forName("cp1255")); 

//Here output 
+0

+1 Merci! C'est perspicace, mais un peu trop compliqué pour mes besoins actuels. –