Символ апострофа (') показывается как «во время записи файла CSV с использованием PrintWriter и просмотра в Microsoft Excel с кодировкой по умолчанию [duplicate]

Что такое необработанный тип и почему я часто слышу, что они не должны использоваться в новом коде?

«Необработанный тип» - это использование общего класс без указания аргумента (ов) типа для его параметризованного типа (ов), например используя List вместо List<String>. Когда дженерики были введены в Java, несколько классов были обновлены для использования дженериков. Использование этого класса в качестве «необработанного типа» (без указания аргумента типа) позволило сохранить прежний код.

«Необработанные типы» используются для обратной совместимости. Их использование в новом коде не рекомендуется, потому что использование универсального класса с аргументом типа допускает более сильную типизацию, что, в свою очередь, может улучшить понятность кода и привести к появлению потенциальных проблем раньше.

Что такое альтернатива, если мы не можем использовать необработанные типы и как это лучше?

. Предпочтительной альтернативой является использование общих классов, как предполагалось, - с подходящим аргументом типа (например, List<String>). Это позволяет программисту более конкретно указывать типы, придавая будущим сопровождающим больше смысла предполагаемое использование переменной или структуры данных и позволяет компилятору обеспечивать лучшую безопасность типов. Эти преимущества вместе могут улучшить качество кода и помочь предотвратить появление некоторых ошибок кодирования.

Например, для метода, в котором программист хочет, чтобы переменная List, называемая «имена», содержит только строки:

List<String> names = new ArrayList<String>();
names.add("John");          // OK
names.add(new Integer(1));  // compile error
97
задан Cole Johnson 29 December 2013 в 01:43
поделиться

11 ответов

Убедитесь, что браузер и редактор используют кодировку UTF-8 вместо ISO-8859-1 / Windows-1252.

Или используйте &rsquo;.

40
ответ дан kennytm 21 August 2018 в 22:28
поделиться
  • 1
    & quot; Или использовать & amp; rsquo; & quot; , Проблема решена. – Jitendra Vyas 19 March 2010 в 14:48
  • 2
    Нет, это не решено. В вашем приложении по-прежнему существует несогласованность в кодировке символов. Вы снова столкнетесь с той же проблемой в будущем для других символов, отличных от CP1252. И их довольно много ... – BalusC 19 March 2010 в 14:51
  • 3
    Примеры символов, с которыми вы будете продолжать сталкиваться: i18nqa.com/debug/utf8-debug.html – Zoot 28 January 2014 в 18:38
  • 4

Вместо знака фунта я использовал: & amp; фунт; без пространства. Это разрешило эту проблему для меня.

Для евро: & amp; евро; без пробела.

-5
ответ дан Andrew Barber 21 August 2018 в 22:28
поделиться

Итак, в чем проблема,

Это символ ( RIGHT SINGLE QUOTATION MARK - U + 2019), который был закодирован как CP-1252 вместо UTF-8 . Если вы проверите таблицу encodings , вы увидите, что этот символ находится в UTF-8, состоящий из байтов 0xE2, 0x80 и 0x99. Если вы проверите макет кодовой страницы CP-1252 , вы увидите, что каждый из этих байтов обозначает отдельные символы â, и .

< hr>

и как его исправить?

Используйте UTF-8 вместо CP-1252 для чтения, записи, сохранения и отображения символов.


У меня есть Content-Type, установленный в UTF-8 как в моем теге <head>, так и в моих HTTP-заголовках:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Это только инструктирует клиент, кодирование которого используется для интерпретации и отображения символов. Это не дает указания вашей собственной программе, которую кодировка должна использовать для чтения, записи, хранения и отображения символов. Точный ответ зависит от используемой серверной платформы / базы данных / языка программирования. Обратите внимание, что тот, который установлен в заголовке ответа HTTP, имеет приоритет над метатегами HTML. Метатег HTML будет использоваться только тогда, когда страница будет открыта из локальной файловой системы диска, а не из HTTP.


Кроме того, мой браузер настроен на Unicode (UTF-8):

Это только заставляет клиента кодирование использовать для интерпретации и отображения символов. Но актуальной проблемой является то, что вы уже отправили ’ (закодированный в UTF-8) клиенту вместо . Клиент правильно отображает ’, используя кодировку UTF-8. Если клиент был неправильно проинсталлирован для использования, например, ISO-8859-1, скорее всего, вы видели ââ¬â¢.


Я использую ASP.NET 2.0 с базой данных.

Это наиболее вероятно, где ваша проблема. Вы должны проверить с помощью независимого инструмента базы данных, как выглядят данные.

Если присутствует символ , значит, вы неправильно подключаетесь к базе данных. Вы должны указать соединителю базы данных, чтобы использовать UTF-8.

Если ваша база данных содержит ’, значит, ваша база данных испорчена. Скорее всего, таблицы не настроены на использование UTF-8. Вместо этого они используют кодировку по умолчанию для базы данных, которая зависит от конфигурации. Если это ваша проблема, достаточно просто изменить таблицу для использования UTF-8. Если ваша база данных не поддерживает это, вам нужно будет воссоздать таблицы. Хорошая практика - установить кодировку таблицы при ее создании.

Скорее всего, вы используете SQL Server, но здесь есть код MySQL (скопированный из этой статьи ):

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

Если ваша таблица, однако, уже UTF-8, вам нужно сделать шаг назад. Кто или , что поместил там данные. Это , где проблема. Одним из примеров может служить формат HTML, который неправильно кодирован / декодирован.


Вот еще несколько ссылок, чтобы узнать больше о проблеме:

169
ответ дан BalusC 21 August 2018 в 22:28
поделиться

Если ваш тип контента уже является UTF8, то, скорее всего, данные уже поступают в неправильную кодировку. Если вы получаете данные из базы данных, убедитесь, что соединение с базой данных использует UTF-8.

Если это данные из файла, убедитесь, что файл правильно закодирован как UTF-8. Обычно вы можете установить это в диалоговом окне «Сохранить как ...» выбранного вами редактора.

Если данные уже нарушены при просмотре в исходном файле, скорее всего, это быть файлом UTF-8, но где-то в пути он был сохранен в неправильной кодировке.

7
ответ дан Cole Johnson 21 August 2018 в 22:28
поделиться

Если кто-то получил эту ошибку на веб-сайте WordPress, вам необходимо изменить wp-config db charset:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

вместо:

define('DB_CHARSET', 'utf8mb4');
3
ответ дан Goran Jakovljevic 21 August 2018 в 22:28
поделиться

Вы должны иметь текст для копирования / вставки из Word Document. Документ Word использует Smart Quotes. Вы можете заменить его специальным символом (& amp; rsquo;) или просто ввести свой HTML-редактор (').

Я уверен, что это решит вашу проблему.

-1
ответ дан Kaushal Panchal 21 August 2018 в 22:28
поделиться

У вас несоответствие в кодировке вашего персонажа; ваша строка кодируется в одной кодировке (UTF-8), и все, что интерпретирует эту страницу, использует другую (например, ASCII).

Всегда указывайте свою кодировку в своих заголовках HTTP и убедитесь, что это соответствует определению вашей инфраструктуры кодирование.

Пример HTTP-заголовка:

Content-Type    text/html; charset=utf-8

Настройка кодировки в asp.net

<configuration>
  <system.web>
    <globalization
      fileEncoding="utf-8"
      requestEncoding="utf-8"
      responseEncoding="utf-8"
      culture="en-US"
      uiCulture="de-DE"
    />
  </system.web>
</configuration>

Настройка кодирование в jsp

7
ответ дан Michael 21 August 2018 в 22:28
поделиться

То же самое произошло со мной с символом «-» (длинный знак минус). Я использовал эту простую замену, так что разрешите ее:

htmlText = htmlText.Replace('–', '-');
-3
ответ дан Radim Köhler 21 August 2018 в 22:28
поделиться
  • 1
    Проблема OP - это mojibake, а не аналогичные символы Unicode. – Cole Johnson 28 December 2013 в 09:04

(код кодировки Unicode U+2019 RIGHT SINGLE QUOTATION MARK) кодируется в UTF-8 в виде байтов:

0xE2 0x80 0x99.

’ (кодовые страницы Unicode U+00E2 U+20AC U+2122) кодируется в UTF-8 в виде байтов:

0xC3 0xA2 & nbsp; 0xE2 0x82 0xAC & nbsp; 0xE2 0x84 0xA2.

Это байты, которые ваш браузер фактически получает, чтобы создать ’ при обработке как UTF-8.

Это означает, что ваши исходные данные проходят две конвертации кодировки перед отправкой в ​​браузер:

  1. Символ источника (U+2019) сначала кодируется как байты UTF-8: 0xE2 0x80 0x99
  2. эти отдельные байты затем были неправильно интерпретированы и декодированы в Unicode codepoints U+00E2 U+20AC U+2122 одним из кодировок Windows-125X (1252, 1254, 1256 и 1258), все карты 0xE2 0x80 0x99 - U+00E2 U+20AC U+2122 ), а затем эти кодовые точки кодируются как байты UTF-8: 0xE2 -> U+00E2 -> 0xC3 0xA2 0x80 -> U+20AC -> 0xE2 0x82 0xAC 0x99 -> U+2122 - > 0xE2 0x84 0xA2

Вам нужно найти, где выполняется дополнительное преобразование на шаге 2.

8
ответ дан Remy Lebeau 21 August 2018 в 22:28
поделиться
  • 1
    Самый полезный ответ для меня, естественно, у эксперта Паскаля! – Slashback 2 December 2017 в 18:30

Это иногда случается, когда строка преобразуется из Windows-1252 в UTF-8 дважды .

У нас это было в приложении Zend / PHP / MySQL, где такие символы появлялись в базе данных, вероятно, из-за подключения MySQL, не задающего правильный набор символов. Нам пришлось:

  1. Обеспечить, чтобы Zend и PHP обменивались данными с базой данных в UTF-8 (по умолчанию был not )
  2. Исправить поврежденную символы с несколькими SQL-запросами, такими как ...
    UPDATE MyTable SET 
    MyField1 = CONVERT(CAST(CONVERT(MyField1 USING latin1) AS BINARY) USING utf8),
    MyField2 = CONVERT(CAST(CONVERT(MyField2 USING latin1) AS BINARY) USING utf8);
    
    Сделайте это для того, чтобы сколько угодно таблиц / столбцов.

Вы также можете исправить некоторые из этих строк в PHP, если это необходимо. Обратите внимание, что поскольку символы были закодированы дважды , нам действительно нужно сделать обратное преобразование из UTF-8 обратно в Windows-1252, что сначала смутило меня.

mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’
6
ответ дан Simon East 21 August 2018 в 22:28
поделиться

У меня есть некоторые документы, где показывался как … и ê показывался как ê. Вот как это получилось (код python):

# Adam edits original file using windows-1252
windows = '\x85\xea' 
# that is HORIZONTAL ELLIPSIS, LATIN SMALL LETTER E WITH CIRCUMFLEX

# Beth reads it correctly as windows-1252 and writes it as utf-8
utf8 = windows.decode("windows-1252").encode("utf-8")
print(utf8)

# Charlie reads it *incorrectly* as windows-1252 writes a twingled utf-8 version
twingled = utf8.decode("windows-1252").encode("utf-8")
print(twingled)

# detwingle by reading as utf-8 and writing as windows-1252 (it's really utf-8)
detwingled = twingled.decode("utf-8").encode("windows-1252")

assert utf8==detwingled

Чтобы исправить эту проблему, я использовал код python следующим образом:

with open("dirty.html","rb") as f:
    dt = f.read()
ct = dt.decode("utf8").encode("windows-1252")
with open("clean.html","wb") as g:
    g.write(ct)

(поскольку кто-то вставил twingled версии в правильный документ UTF-8, мне на самом деле пришлось извлечь только трясущуюся часть, подключить ее и вставить обратно. Для этого я использовал BeautifulSoup.)

Скорее всего, у вас есть Чарли в создании контента, чем неправильная конфигурация веб-сервера. Вы также можете заставить свой веб-браузер закрутить страницу, выбрав кодировку windows-1252 для документа utf-8. Ваш веб-браузер не может размещать документ, сохраненный Чарли.

Примечание: та же проблема может возникнуть с любой другой однобайтовой кодовой страницей (например, латинским-1), а не с окнами-1252.

13
ответ дан Tiny 21 August 2018 в 22:28
поделиться
  • 1
    это отличное объяснение того, как это происходит в первую очередь – Yi Wang 29 June 2016 в 16:15
Другие вопросы по тегам:

Похожие вопросы: