IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Problème encodage/accents JAVA


Sujet :

Java

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 17
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2022
    Messages : 1
    Par défaut Problème encodage/accents JAVA
    Bonjour, j'ai créé un projet TextEncryptor qui permet de crypter du texte avec une clef qui est ensuite stocké dans un fichier, puis de le décrypter si on met la même clef. Tout marche, le texte se crypte dans un fichier sauf qu'en le décryptant j'obtient ^^^^ à la place de mes lettres accentués (ici le 'é'). Qui pourrait m'aider (code relatif à ce problème ci-dessous)

    fr.akwaa.textencryptor.encryptor.EncryptedFiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    package fr.akwaa.textencryptor.encryptor;
     
    import java.io.*;
    import java.nio.charset.StandardCharsets;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Objects;
     
    /**
     * Créé le 23/01/2022 à 17h44 par valen
     **/
     
    public class EncryptedFiles {
        public static void createEncryptedFile(String encryotedFileName, String content){
            File encryptedFile = new File("EncryptedFiles/" + encryotedFileName + ".encrypted");
            try{
                if(!encryptedFile.exists()){
                    if(!encryptedFile.getParentFile().exists() && !encryptedFile.getParentFile().mkdir()) return;
                    if(!encryptedFile.createNewFile()) return;
                }
     
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(encryptedFile), StandardCharsets.UTF_16);
                byte[] contentBytes = content.getBytes();
                for(byte contentByte : contentBytes) outputStreamWriter.write(contentByte);
                outputStreamWriter.flush();
                outputStreamWriter.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
     
        public static void deleteEncryptedFile(String encryptedFileName){
            File encryptedFile = new File("EncryptedFiles/" + encryptedFileName + ".encrypted");
            if(!encryptedFile.exists()) return;
            if(!encryptedFile.delete()){
                try{
                    throw new IOException();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
     
        public static List<String> getEncryptedFilesName(){
            List<String> encryptedFilesName = new ArrayList<>();
            File encryptedFilesFolder = new File("EncryptedFiles/");
            if(!encryptedFilesFolder.exists()) return encryptedFilesName;
     
            for(File encryptedFile : Objects.requireNonNull(encryptedFilesFolder.listFiles())){
                encryptedFilesName.add(encryptedFile.getName().substring(0, encryptedFile.getName().lastIndexOf(".encrypted")));
            }
     
            return encryptedFilesName;
        }
     
        public static String getEncryptedFileContent(String encryptedFileName){
            StringBuilder fileContentBuilder = new StringBuilder();
     
            try{
                File encryptedFile = new File("EncryptedFiles/" + encryptedFileName + ".encrypted");
                if(!encryptedFile.exists()) return "";
     
                InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(encryptedFile), StandardCharsets.UTF_16);
                int n;
                while((n = inputStreamReader.read()) != -1){
                    fileContentBuilder.append((char) n);
                }
                inputStreamReader.close();
            }catch(IOException e){
                e.printStackTrace();
            }
     
            return fileContentBuilder.toString();
        }
    }
    fr.akwaa.textencryptor.encryptor.Encryptor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    package fr.akwaa.textencryptor.encryptor;
     
    import java.util.ArrayList;
    import java.util.List;
     
    /**
     * Créé le 23/01/2022 à 14h31 par valen
     **/
     
    public class Encryptor {
        public static String encrypt(String input, String key){
            String binaryInput = toBinaryString(input);
            String binaryKey = toBinaryString(key);
     
            List<String> encryptedBytes = new ArrayList<>();
            StringBuilder currentByteBuilder = new StringBuilder();
            int currentBitIndex = 0;
            int keyIndex = 0;
            for(char c : binaryInput.toCharArray()){
                if(Integer.parseInt(String.valueOf(c)) + Integer.parseInt(String.valueOf(binaryKey.charAt(keyIndex))) == 1){
                    currentByteBuilder.append("1");
                }else{
                    currentByteBuilder.append("0");
                }
                currentBitIndex++;
                if(currentBitIndex >= 8){
                    encryptedBytes.add(currentByteBuilder.toString());
                    currentByteBuilder = new StringBuilder();
                    currentBitIndex = 0;
                }
                keyIndex++;
                if(keyIndex >= binaryKey.length()) keyIndex = 0;
            }
     
            StringBuilder output = new StringBuilder();
            for(String encryptedByte : encryptedBytes){
                output.append(Character.valueOf((char) Integer.parseInt(encryptedByte, 2)).toString());
            }
     
            return output.toString();
        }
     
        private static String toBinaryString(String string){
            StringBuilder binaryStringBuilder = new StringBuilder();
     
            for(Byte b : string.getBytes()){
                String binaryString = Integer.toBinaryString(b);
                binaryStringBuilder.append("0".repeat(Math.max(0, 8 - binaryString.length())));
                binaryStringBuilder.append(binaryString);
            }
     
            return binaryStringBuilder.toString();
        }
    }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Hello,

    cette façon de gérer des bits est abominable, mais bon, occupons-nous seulement de cette histoire d'accents.

    Un Writer est fait pour gérer du texte, c'est à dire des chars ou une String (qui n'est qu'une séquence de chars). Tu ne peux pas lui donner des octets, et donc au moment où tu commences à faire content.getBytes() ça ne pouvait pas marcher.
    dans outputStreamWriter.write(contentByte), Writer.write() prend un int, pas un byte. Bon, en fait prendre un int c'était aussi une convention bizarre. Il prend un int mais le convertit en char. Ce qui fait que si tu lui donnes un char, ce qu'il faut normalement faire, il est converti en int puis reconverti vers le même char qui a été passé.

    Bien sûr, en vrai il fallait directement passer la String content.

    En fait, il fallait directement appeler Files.writeString(), sans s'embêter à ouvrir un FileInputStream et un InputStreamWriter.

    .... Bon et en réalité le fichier encrypté n'est pas du texte mais du binaire, donc il ne fallait pas utiliser Writer ni Reader. L'usage d'Unicode a pour effet que les 256 valeurs d'octets possibles sont gérées si on les prend comme les 256 premiers codepoints, mais ça donne un peu l'impression que c'est un coup de bol. En latin-1 ça ne passerait pas.
    La variable content qui contient le message chiffré aurait dû être un byte[] pas une String. Et il n'y aurait donc eu qu'à passer ce byte[] à Files.write() tout simplement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème Encodage XML Java
    Par kichnifou dans le forum Format d'échange (XML, JSON...)
    Réponses: 15
    Dernier message: 23/10/2013, 14h20
  2. Problème encodage caractères sépeciaux - XML - Java - Tomcat
    Par commande dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 19/08/2009, 12h31
  3. RichFaces Calendar :Problème encodage des accents
    Par devParis94 dans le forum JSF
    Réponses: 3
    Dernier message: 15/12/2008, 11h00
  4. Problème encodage-decodage URL avec Java et Javascript
    Par alfreedd dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 27/04/2007, 12h11
  5. [Encodage] Problème d'accents
    Par Loceka dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2006, 10h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo