Comment représenter NSString avec la valeur '\ 336 \ 362 \ 340' dans un encodage approprié en tant que texte normal?

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

Question

J'ai reçu des chaînes comme celle-ci du flux audio en tant que titres:

Þòà - Ïàäàòü

Je sais que cette chaîne en russe.Et je dois le montrer correctement dans UILabel. J'essaye ceci:

NSData *data = [value dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *goodValue = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

Maintenant, goodValue contient la valeur suivante:

\ 336 \ 362 \ 340 - \ 317 \ 340 \ 344 \ 340 \ 362 \ 374

Nombre de caractères tel que je vois la sauvegarde avec l'original.Mais comment dois-je le convertir en chaîne normale pour l'utiliser comme texte dans UILabel?

Merci d'avance.

Était-ce utile?

La solution

J'ai écrit du code pour itérer et enregistrer toutes les combinaisons possibles.

Au début, j'ai trouvé la liste de tous les encodages possibles dans NSString.h et l'ai définie sur tableau C d'encodages possibles:

 int encodings[] = {
    NSASCIIStringEncoding,
    NSNEXTSTEPStringEncoding,
    NSJapaneseEUCStringEncoding,
    NSUTF8StringEncoding,
    NSISOLatin1StringEncoding,
    NSSymbolStringEncoding,
    NSNonLossyASCIIStringEncoding,
    NSShiftJISStringEncoding,
    NSISOLatin2StringEncoding,
    NSUnicodeStringEncoding,
    NSWindowsCP1251StringEncoding,
    NSWindowsCP1252StringEncoding,
    NSWindowsCP1253StringEncoding,
    NSWindowsCP1254StringEncoding,
    NSWindowsCP1250StringEncoding,
    NSISO2022JPStringEncoding,
    NSMacOSRomanStringEncoding,
    NSUTF16StringEncoding,
    NSUTF16BigEndianStringEncoding,
    NSUTF16LittleEndianStringEncoding,
    NSUTF32StringEncoding,
    NSUTF32BigEndianStringEncoding,
    NSUTF32LittleEndianStringEncoding
};

Et maintenant, répétons et montrons tous les résultats possibles:

int numberOfEncodings = 23;

for (int i = 0; i < numberOfEncodings; i++) {
    NSLog(@"=============== %d =============", encodings[i]);
    constchar *asd = [value cStringUsingEncoding:encodings[i]];
    if (asd == NULL) {
        NSLog(@"asd == NULL");
    } else {
        for (int j = 0; j < numberOfEncodings; j++) {
            NSString *str = [NSStringstringWithCString:asd encoding:encodings[j]];
            NSLog(@"%d: %@", encodings[j], str);
        }
    }
}

Après cela, je regarde les résultats et trouve une bonne chaîne.C'est tout=)

note: tous les encodages sont des valeurs d'énumération NSStringEncoding.Et vous pourriez penser que vous pourriez itérer de 0 à nombre d'encodages au lieu de définir le tableau encodings [].Mais vous ne devriez pas faire cela, car les valeurs de codage ne sont pas des entiers ascendants.Par exemple NSMacOSRomanStringEncoding= 30 et certains de ces encodages sont des alias pour un autre.Que mieux pour définir un tableau d'encodages possibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top