Символ с кодировкой UTF8 не имеет эквивалента в WIN1252
Я получаю следующее исключение:
Есть ли способ уничтожить такие символы, с помощью SQL или программно?
(SQL-решение должно быть предпочтительным).
Я думал о подключении к БД с помощью WIN1252, но это даст такую же проблему.
8 ответов
Что вы делаете, когда получаете это сообщение? Вы импортируете файл в Postgres? Как сказал devstuff, это персонаж спецификации. Это символ, который Windows записывает первым в текстовый файл, когда он сохраняется в кодировке UTF8 — это невидимый символ шириной 0, поэтому вы не увидите его при открытии в текстовом редакторе.
Попробуйте открыть этот файл, например, в блокноте, сохраните его в кодировке ANSI и добавьте (или замените аналогичный) строку set client_encoding to ‘WIN1252’ в вашем файле.
У меня была похожая проблема, и я решил ее, установив кодировку в UTF8 с помощью \encoding UTF8 в клиенте, прежде чем пытаться выполнить INSERT INTO foo (SELECT * from bar WHERE x=y); . Мой клиент использовал кодировку WIN1252, но база данных была в формате UTF8, поэтому произошла ошибка.
Дополнительная информация доступна на вики-сайте PostgreSQL по адресу Поддержка набора символов (документы разработчика).
Не пересматривайте персонажей, они настоящие и используются по уважительным причинам. Вместо этого отмените Win1252.
Это выглядит как последовательность байтов 0xBD, 0xBF, 0xEF как целое число с прямым порядком байтов. Это UTF8-закодированная форма символа метки порядка байтов Unicode (BOM) 0xFEFF.
Я не уверен, каково нормальное поведение Postgre, но спецификация обычно используется только для обнаружения кодирования в начале входного потока и обычно не возвращается как часть результата.
В любом случае, ваше исключение связано с тем, что у этой кодовой точки нет сопоставления в кодовой странице Win1252. Это будет происходить с большинством других нелатинских символов, таких как те, которые используются в азиатских шрифтах.
Можете ли вы изменить кодировку базы данных на UTF8 вместо 1252? Это позволит вашим столбцам содержать практически любой символ.
Мне удалось обойти это, используя функцию подстроки Postgres и выбрав ее вместо этого:
Комментарий о том, что специальный символ начинал каждое поле, очень помог в окончательном разрешении.
У меня была очень похожая проблема. У меня был связанный сервер от SQL Server до базы данных PostgreSQL. Некоторые данные, которые я имел в таблице, которую я выбирал, используя оператор openquery, имели какой-то символ, который не имел эквивалента в Win1252. Проблема заключалась в том, что запись системного уведомления о доставке (находится в разделе Администратор источника данных ODBC), которую я использовал для подключения, была настроена на использование PostgreSQL ANSI (x64), а не PostgreSQL Unicode (x64). Создание нового источника данных с поддержкой Unicode и создание нового модифицированного связанного сервера и ссылка на новый связанный сервер в вашем openquery решили эту проблему для меня. Счастливых дней.
Эта проблема появилась для нас примерно 19/11/2016, когда наше старое приложение Access 97 получило доступ к базе данных postgresql 9.1.
Это было решено путем изменения драйвера на UNICODE вместо ANSI (см. комментарий к плану).
Вот что сработало для меня: 1 включить специальные запросы в sp_configure. 2 добавьте ODBC DSN для вашего связанного сервера PostgreSQL. 3 убедитесь, что у вас есть драйверы ANSI и Unicode (x64) (попробуйте оба). 4 Запустите запрос, как показано ниже — измените UID, ip сервера, имя БД и пароль. 5 просто оставьте запрос в последней строке в формате postgreSQL.
Как перекодировать Windows-1252 в UTF-8?
Спарсил один заказ, записываю в базу. Если записывать в базу как есть, то в базе будет: Оформлен
Пробовал переводить этот текст в декодере выводит: CP1252 → UTF-8 = Оформлен
В базу русский текст не записывается(нужно слово «Оформлен»), а пишутся каракули.
1) Пробую перекодировать:
Результат тот же. Вычитал в еще такой способ:
2) Пробую по-другому:
Результат: Îôîðìëåí Смотрю что это за кодировка, результат:
То есть кодировка не меняется? Как сменить кодировку?
3 ответа 3
Это обычная 1251 а не 1252 — очень часто все эти автоматические распознавалки путают эти две кодировки, при этом реально 1252 встречается намного реже.
Ваш вопрос нужно поделить на два вопроса. Сначала верно переконвертировать текст в правильную кодировку (iconv — правильное решение, вы сами написали); второе — верно вставить в базу данных. Вот тут уже нужно смотреть кодировку подключения/базы/сервера и может быть много ньюансов. Ведь вы же везде пишете «база», «в базу», верно?
Сначала посмотрите, чтобы выводилось правильно на страницу (файл, отладчик). Не забывайте, что страница с исходным кодом тоже может кодировку не uft-8, а cp1251. И при выводе на страницу важны заголовки, отдаваемые сервером и прописанные в хедерах.
Потом проверьте настройки подключения к базе. Иногда бывает можно set names utf8 поставить, если лень разбираться в вопросах кодировок.
Как перекодировать latin1 в кириллицу
Мне каждый раз задают один и тот же вопрос, спрашивают об одном и том же: «Как перекодировать кракозябры из базы данных, хранящей строки в кодировке latin1 в нормальную кириллицу (windows-1251) или utf-8».
Ниже я постараюсь наиболее полно ответить на данный вопрос, а также приведу кусок кода на PHP, который однозначно решает проблему.
Во-первых, я никому не рекомендую продолжать работать в кодировке windows-1251. Эта однобайтовая кодировка уже не удовлетворяет требованиям современности. Поскорее переводите все проекты на utf-8. Чем быстрее это будет сделано, тем быстрее пропадут у вас проблемы с кракозябрами.
Теперь о latin1. Эта кодировка (также известна как windows-1252) повсеместно использовалась ранее в MySQL вплоть до версии 4. Символьная таблица кириллических букв находится в ней на месте арабских символов. Но поскольку она тоже однобайтовая, то при чтении данных в этой кодировке из этой таблицы и выводе их как windows-1251 не возникает никаких проблем, ведь коды в итоге те же самые (0xA0-0xFF). Но всё это будет работать только до тех пор, пока вы не установите MySQL 5+, работающий по дефолту в utf-8.
Что же делает MySQL 5+, передавая Вам такие данные? Перед передачей на сторону клиента он честно перекодирует все данные в utf-8, помещая арабские символы (а в latin1 ваша кириллица на самом деле является арабскими символами) в тот диапазон кодов utf-8, где они и должны быть. В результате если вы даже попытаетесь перекодировать полученную utf-8-строку обратно в кириллицу функцией iconv(‘utf-8’, ‘windows-1251’, $str), то у вас ничего не получится. iconv выдаст ошибку, либо вернёт пустую строку.
Первое, что делает программист — он пытается изменить кодировку таблицы latin1 на windows-1251 в phpMyAdmin. Но MySQL этого сделать не может (о чём он и пишет), ведь в кодировке windows-1251 нет соответствующих арабских символов. Второе, что приходит в голову — сконвертировать эту таблицу в utf-8. И это получается. Только вот тексты по-прежнему отображаются кракозябрами.
Как же быть? Как решить эту проблему ?
Решение тут довольно простое, но чтобы к нему прийти самостоятельно, надо чётко понимать — что такое кодировки и как они работают. В понимании поможет моя hand-made диаграмма.
А вот и алгоритм, которым я пользуюсь, чтобы привести кодировки в порядок.
- Перевожу все таблицы БД в кодировку utf-8. При этом якобы кириллические символы, хранящиеся в кодировке latin1, а поэтому на самом деле являющиеся арабскими, переводятся в utf-8 и занимают свои законные места в диапазоне кодов utf-8, предназначенном для арабских символов.
- Пишу микроутилиту на PHP, которая делает следующее с каждой символьной строкой:
- а) Переводит строку в кодировку windows-1252. Тут проблем быть не должно. Тем самым арабские буквы занимают диапазон кодов A0-FF.
- б) Переводит полученную однобайтовую строку в utf-8, но уже не как windows-1252, а как windows-1251, т.е. выдавая символы из диапазона A0-FF за кириллические. В итоге символы попадают в utf-8 в тот диапазон кодов, который предназначен для кириллических символов.
- Всё, теперь наша строка официально является кириллической строкой в utf-8. Её можно записать обратно в ту же ячейку БД, либо сразу выдать в выходной поток. Однако я всё же рекомендую выполнить однократное полное преобразование БД, и забыть о latin1 как о страшном сне.
Ниже привожу сэмпл кода на PHP, который переводит ФИО пользователей в нормальную кириллическую кодировку.
$q = ‘select id, fio from `users`’;
$res = mysql_query($q);
while (($row = mysql_fetch_assoc($res)) !== false) <
// Преобразуем fio из utf-8/latin1 в windows-1252
$s = iconv(‘utf-8’, ‘windows-1252’, $row[‘fio’]);
// Преобразуем строку из однобайтной кодировки обратно в utf-8, выдав её за windows-1251
$s = iconv(‘windows-1251’, ‘utf-8’, $s);
// Сохраняем назад в БД
$q = ‘update `users` set fio = «‘.addslashes($s).'» where id’];
mysql_query($q);
>
Windows-1252 кодировка
Всем привет, имеется таблица в ней есть колонка хранящая некую информацию в Windows-1252 и я вижу там только иероглифы, как сделать что бы отображалась в нормальном виде?
Добавлено через 49 минут
Вопрос решен. буду делать переливку через SSIS а там средствами C# буду делать конвертацию
Преобразование текста из UTF-8 в Windows-1252
Пытаюсь перекодировать текст кириллицей в Windows-1252. Использую функцию WideCharToMultiByte() для.
Кодировка Windows-1251 в Windows Phone
Занимаюсь парсингом сайта на Windows Phone при помощи Html Agility Pack. Сайт в кодировке.
Конвертировать кодировку с 1252 на 1251
Есть 2 текстбокса и кнопка. Нужно что-бы при вставке текста в кодировке 1251 (вот сам пример текста.
Kerio + Unifi + D’link 1252
Доброго всем времени суток, направьте пожалуйста в нужном направлении в следующей проблеме. .
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Смена кодировки CP 1252 на СР 1251
Здравствуйте! Есть файл pdf в неизвестной кодировке, шрифт TTF GostTipeA. При открытии файла в.
сма VICO FLS-1252, индикация 0:-n
как зайти в тест? или снять детский замок ? года два назад был там сам ошибка как на фото (модуль.
Обработать строку с неверной кодировкой (с 1252-1251)
не могу раскодировать строчку «îáñòàíîâêà çàëà â êâàðòèðå», находил на форумах много примеров но ни.
Дельфи заносит данные в базу в кодировке 1252
при создании интерфейса на delphi для БД под mysql столкнулся с проблемой делфи заносит данные в.
Окна-1252 — Windows-1252
MIME / IANA | окна-1252 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Язык (и) | В основном все поддерживается ISO / IEC 8859-1, например, английский , ирландский, итальянский, норвежский, португальский, испанский, шведский. Плюс еще немецкий, финский, исландский и французский. И голландский, кроме символа. И словенский, кроме символа č . | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Создано | Microsoft | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Стандарт | Стандарт кодирования WHATWG | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Классификация | расширенный ASCII , Windows-125x | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Расширяется | ISO 8859-1 (кроме элементов управления C1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Преобразует / кодирует | ISO 8859-15 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_0 | _1 | _2 | _3 | _4 | _5 | _6 | _7 | _8 | _9 | _A | _B | _C | _D | _E | _F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ 0 | NUL 0000 0 | SOH 0001 01 | STX 0002 02 | ETX 0003 03 | EOT 0004 04 | ENQ 0005 05 | ACK 0006 06 | БЕЛ 0007 07 | BS 0008 08 | HT 0009 09 | LF 000A 010 | ВТ 000Б 011 | FF 000C 012 | CR 000D 013 | SO 000E 014 | SI 000F 015 |
1_ 16 | DLE 0010 016 | DC1 0011 017 | DC2 0012 018 | DC3 0013 019 | DC4 0014 020 | NAK 0015 021 | SYN 0016 022 | ETB 0017 023 | CAN 0018 +024 | EM 0019 025 | SUB 001A 026 | ESC 001B 027 | FS 001C 028 | GS 001D 029 | RS 001E 030 | США 001F 031 |
2_ 32 | SP 0020 32 | ! 0021 33 | « 0022 34 | # 0023 35 | $ 0024 36 | % 0025 37 | & 0026 38 | ‘ 0027 39 | ( 0028 40 | ) 0029 41 | * 002A 42 | + 002B 43 | , 002C 44 | — 002D 45 | . 002E 46 | / 002F 47 |
3_ 48 | 0 0030 48 | 1 0031 49 | 2 0032 50 | 3 0033 51 | 4 0034 52 | 5 0035 53 | 6 0036 54 | 7 0037 55 | 8 0038 56 | 9 0039 57 | : 003A 58 | ; 003B 59 | 003C 60 | = 003D 61 | > 003E 62 | ? 003F 63 |
4_ 64 | @ 0040 64 | A 0041 65 | В 0042 66 | С 0043 67 | D 0044 68 | E 0045 69 | F 0046 70 | G 0047 71 | В 0048 72 | Я 0049 73 | J 004A 74 | К 004В 75 | L 004C 76 | M 004D 77 | № 004E 78 | O 004F 79 |
5_ 80 | П 0050 80 | Q 0051 81 | R 0052 82 | С 0053 83 | Т 0054 84 | U 0055 85 | V 0056 86 | W 0057 87 | X 0058 88 | Y 0059 89 | Z 005A 90 | [ 005B 91 | \ 005C 92 | ] 005D 93 | ^ 005E 94 | _ 005F 95 |
6_ 96 | ` 0060 96 | а 0061 97 | b 0062 98 | c 0063 99 | d 0064 100 | e 0065 101 | f 0066 102 | г 0067 103 | h 0068 104 | я 0069 105 | j 006A 106 | k 006B 107 | l 006C 108 | м 006D 109 | № 006E 110 | o 006F 111 |
7_ 112 | п 0070 112 | в 0071 113 | р 0072 114 | с 0073 115 | т 0074 116 | u 0075 117 | v 0076 118 | ж 0077 119 | х 0078 120 | г 0079 121 | z 007A 122 | < 007B 123 | | 007C 124 | > 007D 125 | | DEL 007F 0127 |
8_ 128 | € 20AC 0128 | ‚ 201A 0130 | ƒ 0192 0131 | „ 201E 0132 | … 2026 0133 | † 2020 0134 | ‡ 2021 0135 | 02C6 0136
| ‰ 2030 0137 | Š 0160 0138 | ‹ 2039 0139 | Œ 0152 0140 | Ž 017D 0142 | |||
9_ 144 | ‘ 2018 0145 | ‘ 2019 0146 | « 201C 0147 | ” 201D 0148 | • 2022 0149 | — 2013 0150 | — 2014 0151 | ˜ 02DC 0152 | ™ 2122 0153 | š 0161 0154 | › 203A 0155 | œ 0153 0156 | ž 017E 0158 | Ÿ 0178 0159 | ||
A_ 160 | NBSP 00A0 0160 | ¡ 00A1 0161 | ¢ 00A2 0162 | £ 00A3 0163 | ¤ 00A4 0164 | ¥ 00A5 0165 | ¦ 00A6 0166 | § 00A7 0167 | ¨ 00A8 0168 | © 00A9 0169 | ª 00AA 0170 | « 00AB 0171 | ¬ 00AC 0172 | SHY 00AD 0173 | ® 00AE 0174 | ¯ 00AF 0175 |
B_ 176 | ° 00B0 0176 | ± 00B1 0177 | ² 00B2 0178 | ³ 00B3 0179 | ´ 00B4 0180 | µ 00B5 0181 | ¶ 00B6 0182 | · 00B7 0183 | ¸ 00B8 0184 | ¹ 00B9 0185 | º 00BA 0186 | » 00BB 0187 | ¼ 00BC 0188 | ½ 00BD 0189 | ¾ 00BE 0190 | ¿ 00BF 0191 |
C_ 192 | À 00C0 0192 | Á 00C1 0193 | Â 00C2 0194 | Ã 00C3 0195 | Ä 00C4 0196 | Å 00C5 0197 | Æ 00C6 0198 | Ç 00C7 0199 | È 00C8 0200 | É 00C9 0201 | Ê 00CA 0202 | Ë 00CB 0203 | Ì 00CC 0204 | Í 00CD 0205 | Î 00CE 0206 | Ï 00CF 0207 |
D_ 208 | Ð 00D0 0208 | Ñ 00D1 0209 | Ò 00D2 0210 | Ó 00D3 0211 | Ô 00D4 0212 | Õ 00D5 0213 | Ö 00D6 0214 | × 00D7 0215 | Ø 00D8 0216 | Ù 00D9 0217 | Ú 00DA 0218 | Û 00DB 0219 | Ü 00DC 0220 | Ý 00DD 0221 | Þ 00DE 0222 | ß 00DF 0223 |
E_ 224 | à 00E0 0224 | á 00E1 0225 | № 00E2 0226 | ã 00E3 0227 | ä 00E4 0228 | å 00E5 0229 | æ 00E6 0230 | ç 00E7 0231 | è 00E8 0232 | é 00E9 0233 | ê 00EA 0234 | ë 00EB 0235 | ì 00EC 0236 | № 00ED 0237 | î 00EE 0238 | • 00EF 0239 |
F_ 240 | ð 00F0 0240 | ñ 00F1 0241 | ò 00F2 0242 | ó 00F3 0243 | ô 00F4 0244 | х 00F5 0245 | ö 00F6 0246 | ÷ 00F7 0247 | ø 00F8 0248 | ù 00F9 0249 | ú 00FA 0250 | û 00FB 0251 | ü 00FC 0252 | ý 00FD 0253 | þ 00FE 0254 | ÿ 00FF 0255 |
Письмо Число Пунктуация Символ Другой Неопределенный
Согласно информации на сайтах Microsoft и Консорциума Unicode позиции 81, 8D, 8F, 90 и 9D не используются; однако Windows API MultiByteToWideChar сопоставляет их с соответствующими управляющими кодами C1 . Отображение «наилучшего соответствия» также документирует это поведение.
История
- В первой версии кодовой страницы 1252, используемой в Microsoft Windows 1.0, не были определены позиции D7 и F7. Все символы в диапазонах 80–9F также не были определены.
- Для второй версии, используемой в Microsoft Windows 2.0, были определены позиции D7, F7, 91 и 92.
- В третьей версии, используемой с Microsoft Windows 3.1, были определены все современные позиции, кроме знака евро и Z с парой символов caron .
- Последняя версия, указанная выше, дебютировала в Microsoft Windows 98 и была перенесена на более старые версии Windows с обновлением символа евро.
Расширения OS / 2
OS / 2 Операционная система поддерживает кодировку по имени кода страницы 1004 ( CCSID 1004) или «Windows Extended». Это в основном соответствует кодовой странице 1252, за исключением некоторых управляющих символов C0 , замененных диакритическими символами. Отличия от ISO-8859-1 показаны более темным оттенком поверх цветов легенды.
_0 | _1 | _2 | _3 | _4 | _5 | _6 | _7 | _8 | _9 | _A | _B | _C | _D | _E | _F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ 0 | NUL 0000 | SOH 0001 | STX 0002 | ETX 0003 | ˉ 02C9 | ˘ 02D8 | ˙ 02D9 | BEL 0007 | ˚ 02DA | HT 0009 | ˝ 02DD | ˛ 02DB | 02C7 | CR 000D | SO 000E | SI 000F |
Расширения MSDOS [редко]
Существует редко используемая, но полезная графическая расширенная кодовая страница 1252, где коды от 0x00 до 0x1f позволяют рисовать блоки, как это используется в таких приложениях, как MSDOS Edit и Codeview. Одним из приложений, использующих эту кодовую страницу, была утилита для установки / восстановления образа диска корпорации Intel, выпущенная в середине / конце 1995 года. Эти программы были написаны для компьютеров с пользовательской тестовой программой P6 (пример для США). Он использовался исключительно в тогдашнем регионе EMEA (Европа, Ближний Восток и Африка). Со временем программы были изменены, чтобы использовать кодовую страницу 850.