2010-11-16 8 views
1

Cela doit être simple - sûrement que cette méthode est supposée fonctionner - mais je crois avoir un problème de deux octets à un octet.NSString stringWithCharacters Unicode Problème

Le but du code est de générer une chaîne de 0 caractères d'une certaine longueur (10 moins le nombre de chiffres qui seront ajoutés à la fin). Il ressemble à ceci:

const unichar zero = 0x0030; 
NSString *zeroBuffer = [NSString stringWithCharacters:&zero length:(10 - [[NSString stringWithFormat:@"%i", photoID] length])]; 

Autre deuxième ligne (coulée la chose à l'adresse & zéro):

NSString *zeroBuffer = [NSString stringWithCharacters:(unichar *)&zero length:(10 - [[NSString stringWithFormat:@"%i", photoID] length])]; 

0x0030 est l'adresse du chiffre 0 dans la partie de base latine du unicode table.

Si photoID est 123, je veux que zeroBuffer soit @ "0000000". Qu'est-ce qu'il se termine en fait comme est un zéro, puis quelques caractères unicode fous le long des lignes de (ne sais pas comment cela va se montrer) ceci:

0 䪨 燱 ܾ 뿿;

Je suppose que je Les données traversent des frontières de caractères ou quelque chose. Je l'ai temporairement réécrit comme une chose subcorde stupide, mais cela semble être plus efficace.

Qu'est-ce que je fais mal?

Répondre

3

stringWithCharacters:length: s'attend à ce que le premier argument soit l'adresse d'un tampon contenant chacun des caractères à insérer dans la chaîne en séquence. Il lit votre caractère zéro pour le premier caractère, puis avance à l'adresse de mémoire suivante et lit toutes les données pour le caractère suivant, et ainsi de suite. Ce n'est pas la bonne méthode pour faire ce que vous essayez de faire. Malheureusement, il n'y a pas de méthode intégrée de répétition de cette chaîne. Voir les réponses here pour des suggestions.

Vous pouvez éviter le problème complètement et faire ceci:

[NSString stringWithFormat:@"%010i", photoID]; 

qui provoque le formatter numérique pour produire un nombre décimal rembourré avec dix zéros.

+0

Ah, ça explique tout, merci, plus de poil. Je devrais probablement avoir réalisé que "longueur" ne signifie pas la même chose que "compter". :) Votre solution alternative est parfaite pour mes besoins. FWIW Je me suis installé sur [@ "0000000000" substringToIndex: (10 -... qui a fonctionné mais qui n'était pas joli, mais il pourrait être le plus rapide et le moins gourmand en mémoire (et pas de chaînes mutables!) Si j'avais besoin d'un Personnage à part 0, c'était juste un caractère répétitif, et je savais qu'il avait une longueur maximale raisonnablement petite. –