WriteAllText, кодировка символов, £ и?

Возьмите следующий пример:

string testfile1 = Path.Combine(HttpRuntime.AppDomainAppPath, "folder\\" + "test1.txt");
if (!System.IO.File.Exists(testfile1))
{
    System.IO.File.WriteAllText(testfile1, "£100", System.Text.Encoding.ASCII);
}

string testfile2 = Path.Combine(HttpRuntime.AppDomainAppPath, "folder\\" + "test2.txt");
if (!System.IO.File.Exists(testfile2))
{
    System.IO.File.WriteAllText(testfile2, "£100", System.Text.Encoding.UTF8);
}

Обратите внимание на кодировку. Первые выходы - 100. Второй выводит £100.

Я знаю, что кодировка отличается, но кто-нибудь может объяснить, почему кодировка ASCII не может написать знак £?

2 ответа

ASCII не включает символ "£". То есть - нет никакого байтового значения (или кратного байтового значения - они не существуют в ASCII), которое обозначает этот символ. Так что это показывает вам "?", Чтобы сказать вам это. UTF8, с другой стороны, включает его.

Смотрите здесь список всех печатных символов в ASCII.

Если вы должны использовать ASCII, рассмотрите возможность использованияфунта стерлингов, как указано здесь. (Также может быть актуально: расширенный ASCII.)

Работа с ASCII и некоторыми символами во многом зависит от того, какую кодовую страницу вы используете. Is n't не является символом, который требуется или используется повсеместно в латинском алфавите, поэтому не появился в стандартном наборе ASCII.

Посмотрите эту или эту статью на кодовых страницах, чтобы увидеть, как было разрешено ограничение символов, и понять, почему оно не будет появляться везде.

Как отметил Ханс, ASCII разработан для американцев, использующих только кодовые точки 0-127, незначительный остальной англоязычный мир может смириться с этим, если они не попытаются использовать неясные символы, такие как £, с кодовыми точками вне диапазона 0-127. Я предполагаю, что вы живете в Великобритании и ориентируетесь только на клиентов из Великобритании или Западной Европы. Не использоватьEncoding.ASCII но Encoding.DefaultЭто будет кодовая страница 1252 в Великобритании, конечно, не в Турции. Вы получаете настоящий ASCII для каждого символа в диапазоне ASCII 0–127, но также можете использовать символы в диапазоне 128–255, где находится символ фунта. Но обратите внимание: если кто-то попытается прочитать файл, предполагая, что он закодирован в UTF8, знак £ закроет содержимое, поскольку он включает байт, которого нет в UTF8. На это указывает какой-то странный глиф вроде.

Другие вопросы по тегам