1

iPhone アプリから単純なテキスト ファイルを NSUTF16StringEncoding として保存すると、追加する新しい行の先頭に余分な「スペース」を追加するように見えます。これは、私がやっていることを詳述した大まかなコードです (正確ではなく、必ずしもそのまま実行できるとは限りません)。

NSArray *paths          = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *tempPath      = [paths objectAtIndex:0];
NSString *tempFilename  = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *tempFilePath  = [tempPath stringByAppendingPathComponent:tempFilename];
NSError *error;

freopen([tempFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:tempFilePath];

NSString *testLine1 = @"test row 1";
[fileHandle seekToEndOfFile];
[fileHandle writeData:[testLine1 dataUsingEncoding:NSUTF16StringEncoding]]; // NSUTF8StringEncoding

NSString *testLine2 = @"test row 2";
[fileHandle seekToEndOfFile];
[fileHandle writeData:[testLine2 dataUsingEncoding:NSUTF16StringEncoding]]; // NSUTF8StringEncoding

NSString *testLine3 = @"test row 3";
[fileHandle seekToEndOfFile];
[fileHandle writeData:[testLine3 dataUsingEncoding:NSUTF16StringEncoding]]; // NSUTF8StringEncoding

[fileHandle closeFile];  

// convert csv text to data
NSData *dataCsvOutput = [NSData dataWithContentsOfFile:tempFilePath];

NSArray *objects  = [NSArray arrayWithObjects:dataCsvOutput, exportFilename, deviceType, nil];        
NSArray *keys     = [NSArray arrayWithObjects:@"data", @"filename", @"devicetype", nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects 
                                                   forKeys:keys];            

NSString  *exportFilename = [withDictionary objectForKey:@"filename"];
NSData    *dataCsvOutput  = [withDictionary objectForKey:@"data"];
NSString  *deviceType     = [withDictionary objectForKey:@"devicetype"];

MFMailComposeViewController *mfViewController = [[MFMailComposeViewController alloc] init];
mfViewController.mailComposeDelegate          = self;
[mfViewController setSubject:@"Test"];
[mfViewController setMessageBody:[NSString stringWithFormat:@"Please find data attached."] isHTML:NO];
[mfViewController addAttachmentData:dataCsvOutput mimeType:@"text/plain;charset=utf-16" fileName:exportFilename];
[self presentModalViewController:mfViewController animated:YES];
[mfViewController release];  

結果のテキスト ファイルは次のようになります。

テスト行 1
 テスト行 2
 テスト行 3

その理由を誰でも提案できますか?UTF-8 でエクスポートすると正常に動作します。

ありがとう。

4

1 に答える 1

2

NSUTF16StringEncoding(これは のエイリアスですNSUnicodeStringEncoding) いわゆる「バイトオーダーマーカー」を出力の先頭に追加します。これはバイト「FE FF」または「FF FE」で構成され、後続のデータがビッグエンディアンかリトルエンディアンかを示しますUTF-16。

バイト オーダー マーカーを回避するには、 または のいずれNSUTF16BigEndianStringEncodingかを使用しますNSUTF16LittleEndianStringEncoding

備考:のより良い代替手段

[tempFilePath cStringUsingEncoding:NSASCIIStringEncoding]

[tempFilePath fileSystemRepresentation];
于 2012-10-09T17:24:15.190 に答える