PDA

Просмотр полной версии : кодирование\раскодирование Unicod в файлах _ru.property



RusIvan
13.03.2008, 13:00
Может уже есть, но все пролистал, не нашел.
Есть необходимость написания кода в VB для автоматического создания файлов _ru.properties (брифингов). Но видно мои познания недостаточны. Никак не могу перевести текст вида
\u0422\u0438\u043F: \u041F\u0430\u0442\u0440\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\n\n\u0414\u0430\u0442\u0430: 01 \u0418\u044E\u043B\u044F 1941\n\n\u0412\u0440\u0435\u043C\u044F: 9:40\n\n\u041F\u043E\u0433\u043E\u0434\u0430: \u042F
в нормальный, и обратно средствами Визуал бейсик. Может кто то сталкивался с этим, и ужи имеет либо код, либо даст полезный совет.
Заранее спасибо

Schalker
13.03.2008, 13:47
я пользуюсь для этого прогой Shtirlitz IV
------
Shtirlitz IV 4.01 - Одна из лучших программ для исправления писем, искореженных при пересылке, и вообще любых нечитаемых текстов. Хотел было написать лучшая, но потом спохватился: что же, я тогда, выходит, использую не лучшую? (а использую я при необходимости MailReader). Несмотря на то, что не повернулся у меня язык назвать Штирлица лучшей программой, из бесплатных он, на мой взгляд, действительно лучший (вообще-то программа является "adware", но в данном случае это не столь важно). Цитирую автора:
Программа Штирлиц расшифровывает русские тексты, написанные в различных русских кодировках (Win-1251, KOI-8r, DOS, ISO-8859-5, MAC и др.), в транслитерации, в форматах Quoted Printable, UTF-7, UTF-8, RTF, HTML, закодированные с помощью uuencode, xxencode, base64, binhex, BtoA тексты и файлы, а также тексты, подвергнувшиеся смешанному перекодированию и, в частности, имеющих фрагменты в различных кодировках. Штирлиц способен привести такие тексты к кодировке Windows (1251) для их прочтения и для дальнейшей работы с ними (сохранение, печать, исправления и пр.), а также произвести обратные преобразования. Кодировки и схемы транслитерации можно добавлять и корректировать. Механизм распознавания кодировки может запускаться автоматически при вставке текста из буфера обмена и при загрузке файла. Интерфейс - русский, английский, болгарский.
------
http://soft.softodrom.ru/ap/p336.shtml
-------
с ее помощью собрал тексты из Курсанта в один файл.
советую.

RusIvan
13.03.2008, 14:36
спасибо. Со Штирлицем имел дело. Но это отдельная программа предполагающая ручную загрузку и прочее. А мне нужен код для автогенератора. Кстати какой то глюк у меня и со Штирлицем. Толи версию другую поставил, то ли что то с кодировками Винды не то. В прошлый раз когда ставил все было ок, а теперь он не транслирует файлы брифингов...

FilMit
13.03.2008, 16:06
Может уже есть, но все пролистал, не нашел.
Есть необходимость написания кода в VB для автоматического создания файлов _ru.properties (брифингов). Но видно мои познания недостаточны. Никак не могу перевести текст вида
\u0422\u0438\u043F: \u041F\u0430\u0442\u0440\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\n\n\u0414\u0430\u0442\u0430: 01 \u0418\u044E\u043B\u044F 1941\n\n\u0412\u0440\u0435\u043C\u044F: 9:40\n\n\u041F\u043E\u0433\u043E\u0434\u0430: \u042F
в нормальный, и обратно средствами Визуал бейсик. Может кто то сталкивался с этим, и ужи имеет либо код, либо даст полезный совет.
Заранее спасибо

Может я не понял суть вопроса, но вот что сие означает "Тип: Патрулирование

Дата: 01 Июля 1941

Время: 9:40

Погода: Я". Прочёл программкой il2_ru[1.41] http://www.sukhoi.ru/forum/showpost.php?p=812597&postcount=57 от LSA.:)

mr N
13.03.2008, 17:24
имеются WinAPI функции WideCharToMultiByte и MultiByteToWideChar - они именно это и делают
- но вот как ими воспользоваться в басике - я, к сожалению, не имею представления - но это точно возможно

RusIvan
14.03.2008, 02:34
спасибо. Попробую поискать. Правда уже склонясь к тому чтоб тупо сделать таблицу подстановки))
Ab

FilMit тоже спасибо за перевод. Но текст я знаю) Сам набирал в полном редакторе)

mr N
14.03.2008, 08:55
мне тут подсказали, что в басике (если это MS Visual Basic) надо их просто задекларировать - и можно использовать
(декларация вроде должна быть в одну строку)

Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As String, ByVal cchWideChar As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long

Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As String, ByVal cchWideChar As Long) As Long

а как ф-иями пользоваться - в MSDN вполне доступно расписано
(в качестве кодировки я тупо указывал число 1251 - и работало)

и ещё, в 6 студии есть тулза полезная APILOAD.EXE (лежит примерно в <visual_studio_path>\COMMON\Tools\Winapi\APILOAD.EXE) - подготовленные декларации, для использования в басике (только сначала надо в ней открыть файл с декларациями, напр. WIN32API.TXT - лежит рядом с утилитой)
(есть ли что подобное в более позних студиях - не знаю, но что то подобное наверное должно быть)

RusIvan
17.03.2008, 10:36
Mr_N спасибо. Жаль что я уже успел написать код. Но все равно спасибо. На будущее пригодиться

Проблемма оказалась не сложной
\u043D это русская буква "н"
\u - значит уникод 04 - номер кодовой страницы 3D - текстовое написание шестнатеричного кода символа, он больше ASC() кода на 176.
поэтому формула по переводу единичного символа будет выглядеть так
txtTmp=Right("\u043D",2) 'вычленяем "3D"
txtOut=Chr(Val("&H" & txtTmp) + 176) ' получим "н"

а обратная трансляция так
txtIn="н"
txtOut = "\u04" & Hex(Asc(txtIn) - 176)

ньюансы:
символы "Ё" и "ё" кодируются вне этого правила.
\n - кодирует перевод строки
А вот две функции прямая и обратная для перевода целых текстовых блоков из формата Иловских брифингов и обратно
Public Function TransLineFrom(txtIn As String) As String
Dim C As String
Dim i As Integer
Dim V As Integer
Dim txtTmp As String
i = 1
Do Until i > Len(txtIn)
C = Mid(txtIn, i, 1): i = i + 1
If C = "\" Then
C = Mid(txtIn, i, 1): i = i + 1
Select Case C
Case "n"
txtTmp = Chr(13) & Chr(10)
Case "\"
txtTmp = " "
Case "u"
txtTmp = Mid(txtIn, i + 2, 2): i = i + 4
V = Val("&H" & txtTmp) + 176
Select Case V
Case 177
txtTmp = "Ё"
Case 257
txtTmp = "ё"
Case 192 To 255
txtTmp = Chr(Val("&H" & txtTmp) + 176)
Case Else
txtTmp = "!"
End Select
End Select
Else
txtTmp = C
End If
TransLineFrom = TransLineFrom & txtTmp
Loop
End Function



Public Function TransLineTo(txtIn As String) As String
Dim C As String
Dim i As Integer
Dim txtTmp As String
For i = 1 To Len(txtIn)
C = Mid(txtIn, i, 1)
If Asc(C) < 192 Then
Select Case Asc(C)
Case 13
txtTmp = "\n": i = i + 1
Case 168
txtTmp = "\u0401"
Case 184
txtTmp = "\u0451"
Case Else
txtTmp = C
End Select
Else
txtTmp = "\u04" & Hex(Asc(C) - 176)
End If
TransLineTo = TransLineTo & txtTmp
Next i
End Function