Согласно официальной странице MSDN , кодировка по умолчанию не фиксирована - это зависит от настроек ОС. Если вы знаете, какая кодировка файла имеет, укажите это!
EDIT: Затем попробуйте распечатать данные кодировки (например, имя) из .net framework, который работает. Затем укажите то же самое в ядре .net 2. Не полагайтесь на значение по умолчанию. Эта страница MSDN, Список кодировок в образце кода содержит список поддерживаемых кодировок.
UPDATE by gsharp: Мне пришлось ссылаться на пакет NuGet System.Text.Encoding.CodePages
, зарегистрировать их и использовать его
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var enc1252 = Encoding.GetEncoding(1252);
var inStr = new StreamReader(infile, enc1252);
var outStr = new StreamWriter(outFile, false, enc1252);
NSDate
не имеют часовых поясов. Они представляют собой абсолютный момент времени. Однако, когда вы запрашиваете его для своего description
(путем печати его с помощью NSLog()
, например,), он должен выбрать часовой пояс. Самым разумным выбором по умолчанию является GMT. Если вы не находитесь в GMT, дата будет казаться неправильной, на величину вашего собственного смещения.
Вы должны всегда использовать NSDateFormatter
для создания строки для отображения. Часовой пояс форматирования должен быть установлен на ваш, который по умолчанию.
Вы можете скорректировать свою дату следующим образом:
NSDate * dateGMT = [NSDate date];
NSTimeInterval secondsFromGMT = [[NSTimeZone localTimeZone] secondsFromGMT];
NSDate * correctDate = [dateGMT dateByAddingTimeInterval:secondsFromGMT];
-(NSDate *)getDateInCurrentSystemTimeZone
{
NSDate* sourceDate = [NSDate date];
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
NSDate* destinationDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
return destinationDate;
}