CSV в NSString в NSData с проблемой текста на иврите

Я создаю файл CSV из CoreData, используя CHCSVWriter, пока все хорошо, и файл создается отлично. Моя проблема в том, что когда я пытаюсь отправить файл CSV, который я создал, у меня возникают некоторые проблемы, я открываю файл CSV в Excel, и вместо текста на иврите я вижу тарабарщину.

При использовании NSLog для печати результата строки CSV я прекрасно вижу иврит. Даже после конвертации из NSString в NSData и обратно.

Вот что я получаю: יוסי צפר

Это мой код:

- (void)createCSV
{
    CHCSVWriter *writer = [[CHCSVWriter alloc] initForWritingToCSVFile:[self csvFilePath]];
    for (EWDBUsers *user in self.users)
    {
        [writer writeField:user.name];
        [writer writeField:user.company];
        [writer writeField:user.email];
        [writer writeField:user.telephone];
        [writer finishLine];
    }

    [writer closeStream];
}

- (NSString*)csvFilePath
{
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filename = @"users.csv";
    return [documentsDirectory stringByAppendingPathComponent:filename];
}

- (void)showMailComposerController
{
    if ([MFMailComposeViewController canSendMail]) {
        MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
        controller.mailComposeDelegate = self;
        [controller setSubject:@"Users List"];
        [controller setMessageBody:@"Attachment." isHTML:NO];

        NSError *error;
        NSString *csvFileString = [NSString stringWithContentsOfFile:[self csvFilePath] encoding:NSUTF8StringEncoding error:&error];
        NSLog(@"%@", csvFileString);
        NSData *csv = [csvFileString dataUsingEncoding:[NSString defaultCStringEncoding]];
        [controller addAttachmentData:csv mimeType:@"text/cvs" fileName:@"users.csv"];

        if (controller) {
            [self presentModalViewController:controller animated:YES];
        }
    } else {
        return;
    }
}

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?

Заранее спасибо.


person Yossi Tsafar    schedule 08.10.2013    source источник
comment
сталкивалась ли какая-либо проблема с телом, подобная этой uilabel">stackoverflow.com/questions/17955858/, пожалуйста, помогите мне..   -  person Sanoj    schedule 21.12.2013


Ответы (3)


Вы видите тарабарщину, потому что конвертируете Unicode в ASCII. [csvFileString dataUsingEncoding:[NSString defaultCStringEncoding]] должно быть [csvFileString dataUsingEncoding:NSUTF8StringEncoding].

Кроме того, mimeType:@"text/cvs" должно быть mimeType:@"text/csv".

EDIT: Проблема, похоже, в Excel. Открытие полученного CSV-файла в TextEdit отображается просто отлично.

введите здесь описание изображениявведите здесь описание изображения

person neilco    schedule 08.10.2013
comment
Делал также с NSUTF8StringEncoding, но та же проблема. - person Yossi Tsafar; 08.10.2013
comment
Я предполагаю, что в Windows файл CSV будет работать хорошо, возможно, это просто проблема с Excel для Mac. Отличный ответчик, отлично работает с TextEdit. Большое спасибо. - person Yossi Tsafar; 08.10.2013

Мое решение заключается в добавлении символов спецификации в начале, чтобы устранить ошибку в Excel при попытке открыть файлы CSV и сохранить кодировку UTF-8.

cvsStringFile = [[NSString alloc] initWithFormat:@"\357\273\277%@", cvsStringFile];

NSData *myXLSData = [cvsStringFile dataUsingEncoding:NSUTF8StringEncoding];
[picker addAttachmentData:myXLSData mimeType:@"text/csv;charset=utf-8" fileName:@"Report.csv"];
person Ricardo    schedule 25.09.2014

Подозреваю, проблема с кодировкой. Вы отправляете сгенерированный файл с недопустимым типом MIME: text/cvs.

Я бы использовал text/plain с явным параметром charset, например.

text/plain; charset=utf-8

и явно закодировать строку csv в NSData, используя эту кодировку (например, NSUTF8StringEncoding).

Редактировать:

На самом деле существует MIME-тип text/csv

Итак, вы также можете использовать: text/csv; charset=utf-8

person CouchDeveloper    schedule 08.10.2013
comment
Вам нужно быть более конкретным. Можно ли прочитать полученный файл текстовым редактором? Является ли правильным UTF-8? Исходный файл и файл назначения сравниваются одинаково? Есть ли сообщение об ошибке? - person CouchDeveloper; 08.10.2013