4

エンコード タイプが不明な場合、プレーン テキスト (.txt) ファイルを文字列に変換するにはどうすればよいですか?

ユーザーが txt ファイルをアプリにインポートできるようにする機能に取り組んでいます。これは、プレーン テキスト ファイルに有効と見なされるさまざまなエンコーディングのいずれかを利用して、ファイルが任意の数のアプリで作成された可能性があることを意味します。私の理解では、これには (ASCII、UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE、または EBCDIC?!) が含まれる可能性があります。

以下を使用して、物事は順調に進んでいました。

NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&errorReading];

その後、ユーザーがファイルを提供しましたが、インポートすると内容が空になりました。XCode デバッグでファイルを確認したところ、Cocoa エラー 261、NSStringEncoding=4 が表示されました。

私が知っていること:

  • ユーザー提供のファイルは、knowtes というアプリで作成されました
  • ファイルは、Mac OS X の TextEdit、TextWranger などで開きます。
  • ファイルには、ウムラウトなどの「特殊文字」が含まれています (暴言: ウムラウトの「u」にウムラウトがないのはなぜですか?!)
  • ファインダ情報が表示されます:

種類:テキスト

テキスト/プレーン; charset=utf-16le

NSUTF8ファイルを期待しているので、ファイルのutf-16leエンコーディングが鍵であると推測しています。最小公分母として ASCII を使用しようとしました。クラッシュはしませんでしたが、元のファイルには存在しなかった一部の文字がごまかされました。

NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:&errorReading];

そこで、エンコーディングを認識する必要がなくなることを期待して、最初にファイルを NSData に変換しようとしました。それは動かなかった。

    NSData *txtFileData = [NSData dataWithContentsOfFile:path];
    NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSUTF8StringEncoding];

これは私にいくつかの質問を導きます:

  1. エンコードに関係なく、プレーン テキスト ファイルの内容を文字列 (つまり、最小公分母) に変換する普遍的な方法はありませんか? 以前は目的initWithContentsOfFileだったと思いますが、残念ながら現在は廃止されています。ASCIStringEncoding が機能しませんでした。
  2. NSUTF16 でエンコードされたファイルを NSUTF8 の場合とは異なる方法で処理する必要がある文字列に変換することについて何かありますか?
  3. ファイルが実際に URF16LE であると仮定すると、次の提案も機能しないのはなぜですか?

    NSString *txtFileAsString = nil;
    if (path !=nil) {
      NSData *txtFileData = [NSData dataWithContentsOfFile:path];
      NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSASCIIStringEncoding];
    if (!txtFileAsString) {
      txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF8StringEncoding];
    }
    if (!txtFileAsString) {
      txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16StringEncoding];
    }
    if (!txtFileAsString) {
      txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16LittleEndianStringEncoding];
    }
    if (!txtFileAsString) {
      txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16BigEndianStringEncoding];
    }
    if (!txtFileAsString) {
      txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32StringEncoding];
    }
    if (!txtFileAsString) {
      txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32LittleEndianStringEncoding];
    }
    if (!txtFileAsString) {
      txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32BigEndianStringEncoding];
    }}
    
4

1 に答える 1