2013-05-29 4 views
3

J'extrais les données d'un jeu coréen (Ragnarok Online) pour créer une base de données. Je n'ai eu aucun problème pendant des années pour convertir les chaînes de l'encodage ISO-8859-1 à l'encodage EUC-KR en C#.Conversion de chaîne en codage coréen

La fonction que j'ai utilisée pour convertir la chaîne était la suivante.

return Encoding.GetEncoding("EUC-KR").GetString(Encoding.GetEncoding("ISO-8859-1").GetBytes(text); 

Exemple

º»Ç︧ -> 본헬름 

Maintenant, je rencontre des personnages ne convertissaient correctement et je ne sais pas pourquoi.

La chaîne ansi est converti en

Œc¾ç²á -> Oc양꿍 

qui est mal, je suppose. J'ai testé un peu avec l'encodage dans le bloc-notes ++ et si je convertis la chaîne en coréen (Windows-949 au lieu de EUC-KR) elle montre la bonne.

똠양꿍 

Mais en C#, si j'utilise la page de codes 949, elle est toujours la mauvaise. La page de codes "Windows-949" n'est pas connue dans .net framework.

Quel est le codage correct pour ceci ou est-ce que la chaîne source est fausse?

Merci beaucoup.

/éditer: problème résolu. semble comme ISO-8859-1 et EUC-KR étaient faux. Si je convertis de 1252 -> 949 ça va.

+5

La vraie question pour moi est: où avez-vous trouvé le 'texte'? Pour les scénarios d'encodage, je m'attendrais à ce que l'entrée soit 'byte []'.Si vous avez analysé 'text' en quelque sorte * autre * que dans l'encodage correct, il est fort probable que vous ayez déjà corrompu la valeur bien avant qu'elle n'atteigne ce code. –

+0

Le texte est lu à partir d'un fichier texte. Il semble vraiment que l'ISO-8859-1 n'est pas l'encodage correct pour cela. Avec la page de code source 1252 et la page de codes cible 949, cela fonctionne bien. Mais c'est étrange c'est la première fois que j'ai rencontré un tel problème. – mrdiablo

+0

mais ... pourquoi essayez-vous même ISO-8859-1/1252/949? Vous semblez * connaître * l'encodage correct - c'est 51949 aka EUC-KR. Vous devriez lire le fichier texte * en utilisant cet encodage *. –

Répondre

0

La page wiki allemand sur Codepage 949 EUC-KR compare et 949 et déclare

im Gegensatz zu EUC-KR kann sich das nachfolgende Byte jedoch auch im Bereich von 0x41-0x7A befinden

dans Contrairement aux EUC-KR l'octet de fin peuvent également être dans la plage de 0x41 à 0x7A

qui applique à votre cas de la « c » (0x63).

This MSDN page répertorie la page de codes 949 telle que prise en charge par .Net.

1

Merci d'avoir ajouté l'édition avec la réponse à votre question. J'avais des données d'une ancienne base de données où les données étaient stockées dans un codage en langue coréenne qui ne s'affichait pas correctement. Après des heures de lecture avec le code pour convertir les données en un codage différent, je suis tombé sur votre question. J'ai effectué la conversion du code, puis j'ai commencé à extraire des mots coréens valides des entrées de la base de données.

Mon contexte de code est d'une forme .NET application web, et je compris la fonction Page_load ci-dessous pour fournir des exemples de code sur la façon de convertir d'un encodage à un autre:

protected void Page_Load(object sender, EventArgs e) 
{ 

    string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["DictionaryConnection"].ToString(); 
    using (SqlConnection conn = new SqlConnection(strConn)) 
    { 
     conn.Open(); 

     string strSQL = "Select top(100) * from Parts"; 


     SqlCommand command = new SqlCommand(strSQL, conn); 

     SqlDataReader sdr = command.ExecuteReader(); 

     DataTable dt = new DataTable(); 

     dt.Load(sdr); 


     sdr.Close(); 


     StringBuilder sbOut = new StringBuilder(); 


     sbOut.Append("<table border=\"1\">"); 
     sbOut.Append("<tr>"); 
     foreach (DataColumn dc in dt.Columns) 
     { 
      sbOut.Append("<th>" + dc.ColumnName + "</th>"); 

     } 

     sbOut.Append("</tr>"); 

     foreach (DataRow dr in dt.Rows) 
     { 

     sbOut.Append("<tr>"); 
     foreach (DataColumn dc in dt.Columns) 
     { 
      string strOut = ""; 
      if (dr[dc] != null) 
      { 
       if (dc.ColumnName=="Part_h") 
       { 


        int euckrCodepage = 949;//949;//51949; 

        System.Text.Encoding originalEncoding = System.Text.Encoding.GetEncoding(1252); 


        System.Text.Encoding euckr = System.Text.Encoding.GetEncoding(euckrCodepage); 
        StringBuilder sbEncoding= new StringBuilder(); 


        sbEncoding.Append("RAW: " + dr[dc].ToString() + "<br />"); 


        byte[] rawbytes= originalEncoding.GetBytes(dr[dc].ToString()); 


        string s = euckr.GetString(rawbytes); 
        sbEncoding.Append("STRING AS "+euckr.EncodingName+": " + s + "<br />"); 


        strOut = sbEncoding.ToString(); 
       } 
       else 
       { 
       strOut = dr[dc].ToString();  
       } 

      } 

      sbOut.Append("<td>" + strOut + "</td>"); 

     } 

      sbOut.Append("</tr>"); 
     } 

     sbOut.Append("</table>"); 

    conn.Close(); 
    lblText.Text = sbOut.ToString(); 
    } 






}