Про кодування файлів на web-сервері.
IIS має налаштування, у якій кодіровці він очикує файли у каталогах, де зберігаються web-сайти.
Так само Visual Studio має налаштування, у якій кодіровці вона очікує свої файли проєкта.
Але, нажаль, студія постійно збивається і відображає сторінки у абракадабрі, коли навіть все задано корректно.
Щоб подолати ці проблеми, треба дуже добре порозумітися у кодувані текстових файлів.
По-перше, всі текстові файли мають маркер у перших байтах, у якому кодуванні зроблений цій текстовий файл.
І якщо подивитися на ці файли у бінарному вигляді, то можна побачити ці байти власними очима.
Найголовніше тут порозуміння у тому, що якщо файл зроблений у 7-мі битному старовинному кодуванні ASCII, то зрозуміти кодіровку автоматично неможливо, тільки подивившись на текст очима, чи перевірити слова по словнику - чи існують такі слова в той чи іншій мові.
Існують багато різноманітних програм з можливістю перекодіровки, з яких особисто мені подобається Notepadd++
Але все це теорія, а як бути на практиці, коли у реальних сайтів існують сотні і тисячі файлів, якийсь файли мають для студії ось такі маркери кодування, а якийсь не мають.
<meta http-equiv="Content-Language" content="ru"> <meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
І до того ж, всі ці маркери конфліктують між собою - Master-Page зроблені у одному кодуванні, власно сторінки - у іншій, все це суперечить і глобальним налаштуванням Visual Studio і глобальним налаштуванням девелоперского Windows і налаштуванням IIS.
Це конкретна і практична ситуація, наприклад у сайті VOTPUSK.RU, бо йому вже більше 15-ти років, зрозуміло що робився він на багатьох машинах, з різними налаштуваннями Encoding (це навіть стосується ASPX-сторінок), а ще є якись сторонні JavaScript's, зроблені індусами у UTF-16, і безліч окремих хеадерів, які взагалі робили інші люди у Visual InteerDev.
Ще гірші справи, якщо файли названі у якомусь іншому кодуванні, наприклад у японському. Найбільш погане працювати, коли ресурси названі у национальному кодуванні - Модіфікація банковського терміналу для Японії.
Як з усім цим впоратися? Якщо навіть у невеличкому cуб-домені VOTPUSK>RU https://arenda.votpusk.ru/default.aspx існує біля 500 файлів?
Я розповім тут про один невеличкий VB-скріптік , який мені допомагає впоратися з цією проблемою. Ось він.
1: Function encoding(fpn)
2: set file=CreateObject("ADODB.Stream")
3: file.Type=1
4: file.Open
5: file.LoadFromFile fpn
6: data = file.Read
7: file.Close
8: a = hex(Ascb(Midb(data, 1, 1)))
9: b = hex(Ascb(Midb(data, 2, 1)))
10: c = hex(Ascb(Midb(data, 3, 1)))
11: d= hex(Ascb(Midb(data, 4, 1)))
12: encoding = fpn & " : unknow ascii"
13: If a = "EF" AND b = "BB" AND c = "BF" Then encoding = fpn & " : UTF-8"
14: If (a = "FE" AND b = "FF" AND not c = "00" ) then encoding = fpn & " : UTF-16 (BE)"
15: If (a = "FF" AND b = "FE") Then encoding = fpn & " : UTF-16 (LE)"
16: If (a = "00" AND b = "00" AND c = "FE" AND d = "FF" ) then encoding = fpn & " : UTF-32 (BE)"
17: If (a = "FF" AND b = "FE" AND c = "00" AND d = "00" ) then encoding = fpn & " : UTF-32 (LE)"
18: If (a = "2B" AND b = "2F" AND c = "76" AND (d = "38" or d = "39" or d = "2B" or d = "2F" )) then encoding = fpn & " : UTF-7"
19: If (a = "F7" AND b = "64" AND c = "4C") then encoding = fpn & " : UTF-1"
20: If (a = "DD" AND b = "73" AND c = "66" AND d = "73") then encoding = fpn & " : UTF-EBCDIC"
21: If (a = "0E" AND b = "FE" AND c = "FF") then encoding = fpn & " : SCSU"
22: If (a = "FB" AND b = "EE" AND c = "28") then encoding = fpn & " : BOCU-1"
23: If (a = "84" AND b = "31" AND c = "95" AND d = "33") then encoding = fpn & " : GB-18030"
24: End Function
25: wscript.echo encoding(WScript.Arguments.Item(0))
Як ним користуватися? Це можна зробити багатьма шляхами. По-перше зробити наприклад ось такий WSH-файлік, по якому можна просто клацнуть і він викликає цей скриптік з заданим параметром, тобто ім'ям файла, у якому потрібно перевірити кодування.
1: [ScriptFile]
2: Path=C:\Projects\GetEncoding.vbs C:\Projects\Arenda_5\MyPage.aspx
3: [Options]
4: Timeout=1
5: DisplayLogo=1
6: BatchMode=0
Але такий засіб користування не виглядає розумним. Більш розумним виглядає спочатку зробити перелік файлів у каталозі, для якому потрібно зрозуміти кодування кожного файлу.
Після цього я роблю ось такий .BAT-файлік.
І прогоняю його.
Таким чином я отримую ось такий результат.
А далі з цим потрібно щось робити далі, тобто або зводити усі кодування до одного, або прописувати корректне кодування у мастер-пайджі та боді кожного файла. Якщо ресурси названі у национальному кодуванні, то все трохи гірше. Глобально - це лише перший крок до вирішення питання абракадабри, яка буває на сайті.