Для людей, которые используют AngularJS , может справиться с этой ситуацией, используя Promises
.
Здесь it говорит,
Обещания могут использоваться для отключения асинхронных функций и позволяют объединять несколько функций вместе.
blockquote>Вы можете найти приятное объяснение здесь .
Пример, найденный в docs , упомянутом ниже.
promiseB = promiseA.then( function onSuccess(result) { return result + 1; } ,function onError(err) { //Handle error } ); // promiseB will be resolved immediately after promiseA is resolved // and its value will be the result of promiseA incremented by 1.
Angular2 and Later
In
Angular2
, посмотрите на следующий пример, но его рекомендовал использоватьObservables
сAngular2
.search(term: string) { return this.http .get(`https://api.spotify.com/v1/search?q=${term}&type=artist`) .map((response) => response.json()) .toPromise();
}
Вы можете использовать это таким образом,
search() { this.searchService.search(this.searchField.value) .then((result) => { this.result = result.artists.items; }) .catch((error) => console.error(error)); }
См. здесь оригинал . Но TypScript не поддерживает native es6 Promises , если вы хотите его использовать, для этого вам может понадобиться плагин.
Кроме того, здесь представлены обещания spec определите здесь.
Это решение записано как исправление для приложения Java, однако вы должны иметь возможность сделать что-то подобное в C #. Вы также можете посмотреть документацию по классу StreamWriter , в примечаниях, которые она ссылается на знак порядка байтов (BOM).
«ANSI as UTF8» (WTF?)
blockquote>NotePad ++, вероятно, правильный. Кодировка UTF8 (т. Е. Правильный заголовок Юникода), но содержит только данные ANSI (т. Е. É не кодируется правильным способом UTF8, что означает два байта).
Или: это другой способ вокруг. Это ANSI (без спецификации заголовка файла), но кодировка отдельных символов является или выглядит UTF8. Это объясняет, что ü и другие символы расширяются более чем одним другим персонажем. Вы можете исправить это, заставив файл читать как Unicode.
Если вы можете опубликовать (часть) вашего CSV, мы сможем помочь его исправить в источнике.
Изменить
Теперь, когда мы увидели ваш код: вы можете удалить StreamWriter и заменить его TextWriter? Кроме того, удалите ручную кодировку спецификации, это необязательно. Когда вы создаете TextWriter, вы можете указать кодировку (не использовать ASCII, попробовать UTF8).
Для моего сценария с использованием StreamWriter я явно передал кодировку UTF8 в excel для StreamWriter, чтобы прочитать файл, используя правильную кодировку.
См. этот ответ для более подробной информации: https://stackoverflow.com/a/22306937/999048
Тревор Жермен помог мне сохранить в правильном закодированном формате
using (var sw = File.Create(Path.Combine(txtPath.Text, "UTF8.csv"))) {
var preamble = Encoding.UTF8.GetPreamble();
sw.Write(preamble, 0, preamble.Length);
var data = Encoding.UTF8.GetBytes("懘荧,\"Hello\",text");
sw.Write(data, 0, data.Length);
}
Я предлагаю вам открыть текстовый файл в шестнадцатеричном редакторе и посмотреть, что это на самом деле. Спецификация для UTF-16 равна 0xFEFF, которая, по-видимому, записывает код записи в поток, но в остальной части записи не указывается кодировка для использования - она будет использовать кодировку по умолчанию StreamWriter, которая является UTF-8 ,
Когда вы открываете файл в шестнадцатеричном представлении, если вы видите много символов 0x00 между символами, вы работаете с UTF-16, который является кодировкой. Unicode в C #. Если между символами нет 0x00, кодировка, вероятно, UTF-8.
Если последний случай, просто исправьте спецификацию, чтобы быть EF BB BF
, а не FE FF
, и нормально читайте с помощью UTF- 8.
попробуйте следующее:
using (var sw = File.Create(Path.Combine(txtPath.Text, "UTF8.csv")))
{
var preamble = Encoding.UTF8.GetPreamble();
sw.Write(preamble, 0, preamble.Length);
var data = Encoding.UTF8.GetBytes("懘荧,\"Hello\",text");
sw.Write(data, 0, data.Length);
}
Он записывает правильную преамбулу UTF8 в файл перед записью CSV с кодировкой UTF8.