Je ne connais vraiment pas grand-chose aux opérations IO. . . J'ai également peu de connaissances en codage et en caractères tronqués. . . Aujourd'hui, j'ai rencontré le besoin de convertir l'encodage d'un fichier et de renvoyer une chaîne codée, telle que l'encodage GBK d'origine, convertie en UTF-8.
Parmi eux, la classe BytesEncodingDetect ne sera pas publiée. Principalement utilisé pour obtenir le format d'encodage du fichier.
J'ai d'abord essayé de modifier la méthode d'encodage directement dans le fichier source et d'utiliser URLEncoder et URLDecoder pour la conversion, mais cela n'a toujours pas fonctionné. Le dernier caractère d’un nombre impair en chinois est tronqué.
Baidu a cherché une solution, mais a échoué, ils ont donc dû adopter mon idée : d'abord lire le contenu du fichier source, le stocker dans StringBuffer, puis supprimer le fichier source, puis créer un nouveau fichier, puis le stocker dans un autre. forme d'encodage.
Afficher l'effet après l'encodage : veillez à ne pas afficher l'effet dans Eclipse. Eclipse ne le visualise que sous une forme d'encodage, vous pouvez donc afficher les fichiers HTML du côté du navigateur. Pour afficher l'encodage spécifié, vous pouvez cliquer avec le bouton droit sur ---. encodage pour déterminer s’il réussit.
Copiez le code comme suit :
paquet com.test;
importer java.io.BufferedReader ;
importer java.io.BufferedWriter ;
importer java.io.File ;
importer java.io.FileInputStream ;
importer java.io.FileOutputStream ;
importer java.io.InputStream ;
importer java.io.InputStreamReader ;
importer java.io.OutputStream ;
importer java.io.OutputStreamWriter ;
importer java.net.URLDecoder ;
importer java.net.URLEncoder ;
transcodage de classe publique {
private BytesEncodingDetect encode = new BytesEncodingDetect();
transcodage public() {
}
/**
* Conversion de codes
* @param toCharset L'encodage à convertir
* @param path Le chemin du fichier à convertir
* @retour
* @throwsException
*/
L'encodage de chaîne publique (String toCharset, String path) génère une exception {
Fichier srcFile = nouveau fichier (chemin);
int index = encode.detectEncoding(srcFile);
String charset = BytesEncodingDetect.javaname[index];
// L'encodage est le même, pas besoin de transcoder
if (charset.equalsIgnoreCase(toCharset)) {
return "L'encodage est le même, aucune conversion n'est nécessaire";
}
InputStream in = new FileInputStream(chemin);
BufferedReader br = nouveau BufferedReader (
new InputStreamReader(in, charset));
StringBuffer sb = new StringBuffer();
Chaîne s1 ;
while ((s1=br.readLine())!=null) {
Chaîne s = URLEncoder.encode(s1, toCharset);
sb.append(s+"/r/n");//Une ligne + retour chariot
}
br.close();
srcFile.delete();//Supprimer le fichier d'origine
//Réécrit le fichier avec le nouvel encodage et renvoie la valeur
Fichier newfile = nouveau fichier (chemin); // Reconstruire le fichier d'origine
newfile.createNewFile();
OutputStream out = nouveau FileOutputStream (nouveau fichier);
OutputStreamWriterwriter = new OutputStreamWriter(out, toCharset);
BufferedWriter bw = new BufferedWriter(écrivain);
bw.write(URLDecoder.decode(sb.toString(), toCharset));
Résultat de la chaîne = URLDecoder.decode(sb.toString(), toCharset);
bw.flush();//Flash dans le fichier
bw.close();
renvoyer le résultat ;
}
}