Comment traduire les caractères 8 bits en caractères 7 bits? (c'est-à-dire Ü à U)

StackOverflow https://stackoverflow.com/questions/140422

  •  02-07-2019
  •  | 
  •  

Question

Je recherche un pseudocode, ou un exemple de code, pour convertir les caractères ascii à bits supérieurs (comme Ü, qui est étendu ascii 154) en U (qui est ascii 85).

Ma première hypothèse est que, dans la mesure où il n'y a que 25 caractères ascii similaires à des caractères ascii 7 bits, un tableau de traduction doit être utilisé.

Faites-moi savoir si vous pouvez penser à autre chose.

Était-ce utile?

La solution

En effet, tel que proposé par unxist: " iconv " La fonction existe pour gérer toute conversion étrange pour vous, est disponible dans presque tous les langages de programmation et dispose d'une option spéciale qui tente de convertir les caractères manquants dans la cible avec des approximations.

Utilisez iconv pour convertir simplement votre chaîne d'entrée UTF-8 en ASCII 7 bits.

Dans le cas contraire, vous finirez toujours par frapper au coin: une entrée 8 bits utilisant une page de code différente avec un jeu de caractères différent (ne fonctionnant donc pas du tout avec votre table de conversion), vous avez oublié de mapper un dernier caractère accentué stupide (vous avez mappé). tout accent grave / aigu, mais j'ai oublié de cartographier le caron tchèque ou le '°' nordique), etc.

Bien sûr, si vous souhaitez appliquer la solution à un petit problème spécifique (créer des noms de fichiers adaptés au système de fichiers pour votre collection de musique), les tableaux de recherche constituent le chemin à parcourir (soit un tableau qui pour chaque numéro de code ci-dessus). 128 correspond à une approximation inférieure à 128 proposée par JeeBee, ou aux paires source / cible proposées par vIceBerg en fonction des fonctions de substitution déjà disponibles dans la langue de votre choix), car elle est rapidement piratée et vérifie rapidement la présence d'éléments manquants.

Autres conseils

Pour les utilisateurs .NET, article dans CodeProject (grâce à le conseil de GvS ) répond en effet plus correctement à toute autre question vu jusqu'à présent.

Cependant, le code de cet article (dans la solution n ° 1) est fastidieux. Voici une version compacte:

// Based on http://www.codeproject.com/Articles/13503/Stripping-Accents-from-Latin-Characters-A-Foray-in
private static string LatinToAscii(string inString)
{
    var newStringBuilder = new StringBuilder();
    newStringBuilder.Append(inString.Normalize(NormalizationForm.FormKD)
                                    .Where(x => x < 128)
                                    .ToArray());
    return newStringBuilder.ToString();
}

Pour développer un peu la réponse, cette méthode utilise String.Normalize qui:

  

Retourne une nouvelle chaîne dont la valeur textuelle est identique à celle-ci,   mais dont la représentation binaire est dans le code Unicode spécifié   formulaire de normalisation.

Dans ce cas, nous utilisons plus particulièrement le NormalizationForm FormKD , décrit dans ces mêmes documents MSDN en tant que tel:

  

FormKD - Indique qu'une chaîne Unicode est normalisée à l'aide d'une décomposition en compatibilité totale.

Pour plus d'informations sur les formulaires de normalisation Unicode, voir Annexe Unicode n ° 15 .

La plupart des langues ont une méthode standard pour remplacer les caractères accentués par de l'ASCII standard, mais cela dépend de la langue et implique souvent le remplacement d'un seul caractère accentué par deux caractères ASCII. par exemple. en allemand & # 252; devient ue. Donc, si vous voulez gérer correctement les langues naturelles, c'est beaucoup plus compliqué que vous ne le pensez.

est en train de convertir & # 220; à U vraiment ce que vous voudriez faire? Je ne connais pas d'autres langues, mais en allemand & # 220; deviendrait Ue, & # 246; deviendrait oe, etc.

Je pense que vous ne pouvez tout simplement pas.

Je fais habituellement quelque chose comme ça:

AccentString = 'ÀÄÄÈÈÊ [et tous les autres]'
ConvertString = 'AAAEEE [et tous les autres]'

Rechercher le caractère dans AccentString et le remplacer par le même index dans ConvertString

HTH

Dans la page de codes 1251, les caractères sont codés avec 2 octets: un pour le caractère de base et un pour la variation. Ensuite, lorsque vous encodez en ASCII, seuls les caractères de base sont conservés.

public string RemoveDiacritics(string text)
{

  return System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding(1251).GetBytes(text));

}

De: http://www.clt-services.com/blog/post/Enlever-les-accents-dans-une-chaine- (proprement) .aspx

Vous semblez avoir réussi, je pense. Tableau d'octets long de 128 octets, indexé par le caractère 127, contenant le caractère de 7 bits correspondant pour le caractère de 8 bits.

Hm, pourquoi ne pas simplement changer l'encodage de la chaîne avec iconv?

Cela dépend vraiment de la nature de vos chaînes source. Si vous connaissez le codage de la chaîne et que vous savez qu'il s'agit d'un codage sur 8 bits - par exemple, ISO Latin 1 ou similaire -, un simple tableau statique suffit:

static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... }
...
new_c = xlate[old_c];

D'un autre côté, si vous avez un codage différent ou si vous utilisez des chaînes codées UTF-8, vous trouverez probablement les fonctions dans le Bibliothèque ICU très utile.

Un article sur le CodeProject est bon.

La conversion à l'aide de la page de code 1251 m'intéresse également (voir autre réponse).

Je n'aime pas les tables de conversion, car le nombre de caractères Unicode est si grand que vous en oubliez facilement un.

Je pense que vous l'avez déjà cloué sur la tête. Compte tenu de votre domaine limité, un tableau de conversion ou un hachage est votre meilleur choix. Aucun sens de créer quelque chose de complexe pour essayer de le faire automatiquement.

Un tableau de recherche est probablement le moyen le plus simple et le plus rapide d'y parvenir. C’est un moyen de convertir, par exemple, ASCII vers EBCDIC.

Les 128 caractères supérieurs n'ont pas de signification standard. Ils peuvent prendre différentes interprétations (pages de code) en fonction de la langue de l'utilisateur.

Par exemple, voir portugais contre Canadien français

Si vous ne connaissez pas la page de code, votre "traduction" se tromper parfois.

Si vous envisagez d'utiliser une certaine page de code (la page de code IBM d'origine, par exemple), un tableau de traduction fonctionnera, mais pour les vrais utilisateurs internationaux, il se trompera souvent.

C’est l’une des raisons pour lesquelles l’unicode est privilégié par rapport à l’ancien système de pages de code.

À proprement parler, l'ASCII ne fait que 7 bits.

Essayez le programme uni2ascii .

J'utilise cette fonction pour corriger une variable avec des accents à passer à une fonction soap de VB6:

Function FixAccents(ByVal Valor As String) As String

    Dim x As Long
    Valor = Replace(Valor, Chr$(38), "&#" & 38 & ";")

    For x = 127 To 255
        Valor = Replace(Valor, Chr$(x), "&#" & x & ";")
    Next

    FixAccents = Valor

End Function

Et dans la fonction soap, je le fais (pour la variable Filename):

FileName = HttpContext.Current.Server.HtmlDecode(FileName)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top