2017-09-07 8 views
1

char*をある程度の長さにする必要があり、NSStringに変換する必要があります。サブストリングchar * in Objective C

char *val部分文字列の長さ

私は、これは中国のような他の特殊文字の言語の作品ではなく、

NSString *tempString = [NSString stringWithCString:val encoding:NSAsciiStringEncoding]; 
NSRange range = NSMakeRange (0, length); 
NSString *finalValue = [tempString substringWithRange: range]; 

を試してみました。 UTF8Encodingに変換すると、部分文字列の長さが一致しません。

char*を部分文字列に変換してからUTF8エンコードに変換する方法はありますか?あなたはエンコーディングを使用する必要が

+0

MD5をチェックしましたか?私は確信していません – karthikeyan

+0

なぜMD5?私はchar *をUTF8文字列に変換する必要があります。変換する前に、私は部分文字列を行う必要があります。 – Cintu

+0

**このリンクを参考にしてください** https://stackoverflow.com/questions/46085704/detect-where-and-what-c​​hanges-within-textfield?answertab=active#tab-top –

答えて

-1

私は両方をコードするのchar *サブ文字列やUTF8をした私の質問

char subString[length+1]; 
strncpy(subString, val, length); 
subString[length] = '\0'; // place the null terminator 
NSString *finalString = [NSString stringWithCString: subString encoding:NSUTF8StringEncoding]; 

のための解決策を見つけました。

+0

ダウン投票の理由はありますか? – Cintu

0

は、文字列がでエンコードされています。あなたの場合は

、あなたはASCII文字列として文字列を解釈すると言います。 ASCII does not have chinese characters.したがって、これは漢字では機能しません。

おそらくUTF8でエンコードされた文字列があります。しかし、単にUTF8に切り替えるだけでは役に立ちません。 NSStringとOS X/iOSはすべて16ビットUnicodeをエンコードしますが、拡張Unicodeは20ビットを持つので、中国語文字には複数のコードが必要です。これにはいくつかの効果があります。例えば、-lengthは、中国語の数ではなく、コードの数を返します。ただし、-rangeOfComposedCharacterSequencesForRange:では範囲を調整できます。例えば

(CJK統合された表意文字-0x20016):

NSString *str = @"";       // One chinese whatever 
NSLog(@"%ld", [str length]);      // This are "2" characters 

NSRange range = {0, 1};       // Range for the "first" character 
NSLog(@"%ld %ld", range.location, range.length); // 0 1 
range = [str rangeOfComposedCharacterSequencesForRange:range]; 
NSLog(@"%ld %ld", range.location, range.length); // 0 2 

あなたが入ってくる文字列と出すために必要なエンコーディングのエンコーディングに関する情報を追加する場合は、より良い答えを得ることができます。

文字列はUTF8などの文字列ではありません。文字列は文字列です。それらの記憶装置表現のコンピュータメモリには、エンコードがありますが、エンコード自体はありません。

+0

だから私はrangeOfComposedCharacterSequencesForRangeでUTF8と部分文字列を使用できますか? – Cintu

+0

入力はNSString、その 'char *'ではありません。 'char *'は各ユニ文字を持っていますが、NSStringに変換してNSStringに変換する必要があります。 – Cintu

+0

'char *'は 'char'が8ビットであるため、それぞれのユニコード文字を持つことができません。これでは十分ではありません。 UTF8の場合は、UTF8を使用します。 20ビットのエンコーディング(3または4バイトを使用し、resp 'char's)がtrueの場合、対応するエンコーディング定数を使用します。しかしまず第一に、取得するエンコーディングについての情報を入手してください。 (あなたがあなたのプログラムで持っている型ではありません)そして*常に* -rangeOfComposedCharacterSequencesForRange: 'を使って範囲を調整してください。 –