none
Détecter la présence de caractères japonais. RRS feed

  • Question

  • Bonjour,

    Je charge un fichier dans un TextBox et je souhaite détecter la présence de caractères japonais afin de changer l'encodage de l'enregistrement.

    J'ai entedu parlé de la fonction WideCharToMultiByte mais elle sert à encoder ou décoder (je ne sais plus) mais moi je cherche à détecter comme le fait Notepad de Windows.

    Merci.



    lundi 29 octobre 2012 01:13

Réponses

  • Merci mais j'ai trouvé (enfin du moins je pense) !

    Dim I As Integer, Chaine As String = Form1.TextBox1.Text
    For I = 0 To Chaine.Length - 1
        If AscW(Mid(Chaine, I + 1, 1)) > 255 Then
            MsgBox( "Le fichier conctient des caractères UTF-8." )
        End If
    Next

    En tout cas, ça détecte les hiragana, katakana et kanji. Mais si quelqu'un a mieux...



    • Marqué comme réponse Michel56100 mercredi 31 octobre 2012 00:33
    • Modifié Michel56100 mercredi 31 octobre 2012 00:33
    mardi 30 octobre 2012 23:27

Toutes les réponses

  • Bonjour MicSoft,

    J'ai quelques éléments de réponses, mais je ne sais pas tous utiliser, ce sera à toi de chercher aussi :

    Dim dosenc As Encoding = Encoding.GetEncoding(850)
     Dim winenc As Encoding = Encoding.Default
     s = dosenc.GetString(winenc.GetBytes(s))
     (En faisant un import de System.Text)
     850 : page de code par défaut du dos
     default : encodage par défaut de windows (page de code 1252)
    *
    Imports System.IO ' (.Sream...) 
    Imports System.Text ' (.Encoding.) 
    Public Class Form1
    ' ...
    Dim path as string
    path = My.Application.Info.DirectoryPath & "\base.txt"
    Dim p As Stream = OpenRead(path)
    ' Décodage (une des quatre possibilités)
    Dim p2 As StreamReader = New StreamReader(p, Encoding.Unicode)
    Dim p2 As StreamReader = New StreamReader(p, Encoding.UTF7)
    Dim p2 As StreamReader = New StreamReader(p, Encoding.UTF8)
    Dim p2 As StreamReader = New StreamReader(p, Encoding.UTF32)
    ' Travail inPut/outPut avec : p2
    

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    lundi 29 octobre 2012 09:19
  • Bonjour,

    merci pour votre réponse mais ceci ne m'aide pas. Par ailleurs, ce n'est pas au chargement mais à l'enregistrement. Je sais utiliser StreamReader(..., Encoding...) mais votre code ne me dit pas s'il y a des caractères ou non, à savoir que je dois utiliser l'encodage adéquate :

    If caractère japonais = True Then
        My.Computer.FileSystem.WriteAllText(FichierNom, Form1.TextBox1.Text, False, Encoding.UTF8)
    else
        My.Computer.FileSystem.WriteAllText(FichierNom, Form1.TextBox1.Text, False, Encoding.Default)
    End If

    :)

    Si je mets Encoding.Default au chargement, les caractères japonais s'affichent, mais si je mets Encoding.Default à l'enregistrement, je perds ces caractères qui deviennent des "?".

    Cordialement


    lundi 29 octobre 2012 12:49
  • Bonjour,

    merci pour votre réponse mais ceci ne m'aide pas. Par ailleurs, ce n'est pas au chargement mais à l'enregistrement. Je sais utiliser StreamReader(..., Encoding...) mais votre code ne me dit pas s'il y a des caractères ou non, à savoir que je dois utiliser l'encodage adéquate :

    If caractère japonais = True Then
        My.Computer.FileSystem.WriteAllText(FichierNom, Form1.TextBox1.Text, False, Encoding.UTF8)
    else
        My.Computer.FileSystem.WriteAllText(FichierNom, Form1.TextBox1.Text, False, Encoding.Default)
    End If

    :)

    Si je mets Encoding.Default au chargement, les caractères japonais s'affichent, mais si je mets Encoding.Default à l'enregistrement, je perds c'est caractères qui deviennent des "?".

    Cordialement

    Bonjour l'enregistrement doit utiliser l'encoding contenant les caractères souhaités, essayer de faire l'enregistrement en UTF8. Encoding.Default prend l'encoding du système d'exploitation.

    Alors si vous souhaitez connaitre les encodings existant, faites ce code :

    For Each enc In Encoding.GetEncodings()
                Console.WriteLine(enc.GetEncoding().EncodingName)
    Next
    Vous allez être surpris de voir l'encoding JIS. De plus vous avez la possibilité de comparer l'encoding de votre fichier grâce à enc.GetEncoding().GetPreamble(). De cette manière vous pouvez savoir quel encoding est utilisé ;)

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine lundi 29 octobre 2012 13:39
    • Proposé comme réponse TroxsaEditor lundi 29 octobre 2012 20:04
    lundi 29 octobre 2012 13:27
  • Bonjour,

    merci de votre réponse mais je ne vois pas comment utiliser enc.GetEncoding().GetPreamble(). Les exemples que j'ai trouvé ne font pas référence à une chaine de caractères.

    J'ai essayé un truc mais il me répond False même s'il y a des caractères japonais. lol

    Dim enc As Encoding = Encoding.GetEncoding("utf-8")
    Dim k As String = Form1.TextBox1.Text
    MsgBox(k.Equals(enc))


    lundi 29 octobre 2012 21:43
  • Bonjour,

    merci de votre réponse mais je ne vois pas comment utiliser enc.GetEncoding().GetPreamble(). Les exemples que j'ai trouvé ne font pas référence à une chaine de caractères.

    J'ai essayé un truc mais il me répond False même s'il y a des caractères japonais. lol

    Dim enc As Encoding = Encoding.GetEncoding("utf-8")
    Dim k As String = Form1.TextBox1.Text
    MsgBox(k.Equals(enc))


    Bonjour,

    Dim enc As Encoding = Encoding.GetEncoding("utf-8") --> permet d'utiliser l'encoding UTF-8 (identique à Encoding.UTF8).

    Ensuite vous ne pouvez comparer une chaine (TextBox1.Text) à enc.ToString().

    GetPreamble() retourne un tableau de byte correspondant à l'entête de votre fichier.

    Voir : http://msdn.microsoft.com/en-us/library/system.text.encoding.getpreamble%28v=vs.80%29.aspx

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    lundi 29 octobre 2012 23:02
  • Bonjour,

    si j'ai bien compris, je ne peux pas savoir si mon TextBox1.Text contient ou non des caractères japonais avant l'enregistrement.

    C'est bien dommage . :(

    Merci quand même.

    mardi 30 octobre 2012 01:00
  • Bonjour,

    Est-ce que votre logiciel va être utilisé sur un système japonais ?


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    mardi 30 octobre 2012 06:50
  • Bonjour,

    Les chaînes de caractères en .NET sont toutes en Unicode.
    Pour savoir si votre chaîne contient des caractères japonais, vous devez vous renseigner quels sont les codes Unicode des caractères Japonais :

    Par exemple consulter cet article Wikipédia qui contient tous les codes Unicode des caractères Japonais :

    http://fr.wikipedia.org/wiki/Table_des_caract%C3%A8res_Unicode/U3000#Blocs_de_caract.C3.A8res_Unicode_pour_les_syllabaires_japonais

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mardi 30 octobre 2012 07:09
    Modérateur
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 30 octobre 2012 08:44
  • Bonjour,

    je réponds dans l'ordre :

    Est-ce que votre logiciel va être utilisé sur un système japonais ?
    Non, je sais que c'est différent. Mais c'est que j'oubli facilement que j'écris en japonais et que j'enregistre en fermant le programme. Du coup, trop tard, tous mes caractères japonais sont des "?".

    Pour savoir si votre chaîne contient des caractères japonais, vous devez vous renseigner quels sont les codes Unicode des caractères Japonais...
    J'utilise les Hiragana, Katakana et Kanji. Je pourrais mettre :

    If TextBox1.text.Tostring.contain(caractère japonais) then enc = Encoding.UTF-8 (un truc du genre)
    Mais il faudrait mettre toute la table des Hiragana, Katakana et c'est impossible de mettre plus de 1000 kanji.

    Est-ce que vous avez testé les solutions proposées ?
    Oui mais cela ne me donne pas la réponse à cette question : Est-ce que
    TextBox1.text contient des Hiragana, Katakana et Kanji ? Si j'ai la réponse à cette question, je sais utiliser l'encodage qu'il faut. Mais je ne veux pas encoder tous mes fichiers en UTF-8. Cela ne fait pas professionnel. :) Pour l'instant, je fais l'encodage manuellement :

    If Form1.TSMenuItemRecModeNormal.Checked = True Then
       
    My.Computer.FileSystem.WriteAllText(FichierNom, Form1.TextBox1.Text, False, Encoding.Default)
    Else
       
    My.Computer.FileSystem.WriteAllText(FichierNom, Form1.TextBox1.Text, False, Encoding.UTF8)
    End If

    mardi 30 octobre 2012 10:57
  • Bonjour,

    J'ai l'idée en tête, je recherche comment l'appliquer techniquement.

    Si vous utilisé le changement de clavier Windows via la barre des tâches le FR/EN/JP (je suppose pour le japonais). Il suffit de vérifier quel clavier est choisit. Je pensais à GetKeyboardLayoutName, mais celui-ci se base sur le clavier par défaut. De plus on peut regarder du coté de Globalization :

    http://msdn.microsoft.com/en-us/goglobal/bb688135.aspx

    Ou CulureInfo :

    http://msdn.microsoft.com/en-us/magazine/cc163824.aspx

    Exemple de code :

    const int KL_NAMELENGTH = 9;
    
            [DllImport("user32.dll")]
            private static extern long GetKeyboardLayoutName(StringBuilder pwszKLID); 
    
            static void Main(string[] args)
            {
                StringBuilder name = new StringBuilder(KL_NAMELENGTH);
    
                while(true)
                {
                    GetKeyboardLayoutName(name);
    
                    Console.WriteLine(name);
                    System.Threading.Thread.Sleep(2000);
                }
    
            }

    Ma solution est une piste à creuser je pense.

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !



    • Modifié Lyamine mardi 30 octobre 2012 22:05
    mardi 30 octobre 2012 22:02
  • Bonjour,

    Cela ressemble à du C++ moi je suis en VB 2008.
    Euh, non ce n'est pas une bonne idée car je passe du clavier JP au clavier FR très souvent donc si au moment de l'enrgistrement, je suis en clavier FR, cela passera inaperçu.

    Je pensais à Ascw() mais je le l'ai jamais utilisé mais je crois qu'il s'agit de caractères supérieur à 255. Je vais tester.

    Merci en tout cas pour votre aide.

    PS : MsgBox(Ascw("の")) = 12389 C'est le kana (caractère) "no" en  hiragana en japonais. Je vais cogiter cela.


    mardi 30 octobre 2012 22:28
  • Oups,

    Autant pour moi je n'avais pas fait attention :

    Const KL_NAMELENGTH As Integer = 9
    
    <DllImport("user32.dll")> _
    Private Shared Function GetKeyboardLayoutName(pwszKLID As StringBuilder) As Long
    End Function
    
    Private Shared Sub Main(args As String())
    	Dim name As New StringBuilder(KL_NAMELENGTH)
    
    	While True
    		GetKeyboardLayoutName(name)
    
    		Console.WriteLine(name)
    		System.Threading.Thread.Sleep(2000)
    	End While
    
    End Sub
    Le code plus haut est en C#. ceci n'est qu'un code d'exemple qui me permettait de voir le changement de clavier (via panneau de config). L'utilisation doit ce faire à l'enregistrement bien évidemment.



    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine mardi 30 octobre 2012 22:57
    mardi 30 octobre 2012 22:54
  • Merci mais j'ai trouvé (enfin du moins je pense) !

    Dim I As Integer, Chaine As String = Form1.TextBox1.Text
    For I = 0 To Chaine.Length - 1
        If AscW(Mid(Chaine, I + 1, 1)) > 255 Then
            MsgBox( "Le fichier conctient des caractères UTF-8." )
        End If
    Next

    En tout cas, ça détecte les hiragana, katakana et kanji. Mais si quelqu'un a mieux...



    • Marqué comme réponse Michel56100 mercredi 31 octobre 2012 00:33
    • Modifié Michel56100 mercredi 31 octobre 2012 00:33
    mardi 30 octobre 2012 23:27
  • Imports System.Text
    Imports System.Runtime.InteropServices
    
    Const KL_NAMELENGTH As Integer = 9
    
    <DllImport("user32.dll")> _
    Private Shared Function GetKeyboardLayoutName(pwszKLID As StringBuilder) As Long
    End Function
    
    Private Shared Sub Main(args As String())
    	Dim name As New StringBuilder(KL_NAMELENGTH)
    
    	While True
    		GetKeyboardLayoutName(name)
    
    		Console.WriteLine(name)
    		System.Threading.Thread.Sleep(2000)
    	End While
    
    End Sub
    

    Bonjour,

    Pour que cela marche, il faut mettre les imports...

    mercredi 7 novembre 2012 14:57