Страницы: 1
RSS
И снова про смену кодировки...
 
Найденные в форуме [и за его пределами] решения с ADODB.Stream и Windows API (MultiByteToWideChar) в моем случае не работают или я не нахожу как их адаптировать :)
 
Есть много текстовых файлов со подобным содержимым:  
 
remindPassword = Восстановить пароль  
forgetPassword = Вы забыли свой пароль пользователя?  
 
Нужно получить:  
 
remindPassword = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438­\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c  
forgetPassword = \u0412\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0441\u0432\u043e\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435­\u043b\u044f?  
 
Ну и обратно, конечно :)  
 
Сейчас выхожу из положения установкой Java JDK 1.5 и запуском строк:  
 
Shell """C:\Program Files\Java\jdk1.5.0_18\bin\native2ascii"" -encoding windows-1251 """ & strFile & """ """ & strFileDest & """"  
 
Shell """C:\Program Files\Java\jdk1.5.0_18\bin\native2ascii"" -encoding windows-1251 -reverse """ & strFile & """ """ & strFileDest & """"  
 
На всякий случай прилагаю файлы.
KL
 
Такой вариант - лишнее поотключал, но тоже может пригодиться:  
 
Sub tt()  
 
Dim objOleCvt  
 
Set objOleCvt = CreateObject("OlePrn.OleCvt.1")  
 
With objOleCvt  
'    MsgBox ".ToUtf8(""Вася"")               :" & .ToUtf8("Вася")  
'    ' 65001 - UTF-8  
'    MsgBox ".ToUnicode(""Вася"", 65001) :" & .ToUnicode("Вася", 65001)  
'  
'    ' 1251 - windows-1251  
'    MsgBox ".ToUnicode(""Вася"", 1251)      :" & .ToUnicode("Вася", 1251)  
'    ' 866 - cp866  
'    MsgBox ".ToUnicode(""‚ бп"", 866)       :" & .ToUnicode("‚ бп", 866)  
     
   MsgBox ".EncodeUnicodeName(""Восстановить пароль"")    :" & Replace(.EncodeUnicodeName("Восстановить пароль"), "~0", "\u")  
'    MsgBox ".Decode/Encode...(""Вася""))    :" & .DecodeUnicodeName(.EncodeUnicodeName("Вася"))  
End With  
 
Set objOleCvt = Nothing  
 
End Sub
 
Hugo, спасибо большое. Попробую поиграть с этим. Немного напрягает замена "~0" на "\u" - как бы не поменять нетого :)
KL
 
А что делать - немного не то на выходе получалось... :)
 
вот  такая функция может помочь?  
 
Function unihex$(s$)  
   Dim sr() As Byte, i&  
   sr = StrConv(s, 64)  
   For i = 0 To UBound(sr) Step 4  
   If sr(i + 2) Then  
       unihex$ = unihex$ & "\u0" & sr(i + 2) & LCase(Hex(sr(i)))  
    Else  
        unihex$ = unihex$ & Chr(sr(i))  
   End If  
   Next  
End Function
Живи и дай жить..
 
Слэн,  
Безусловно, такая функция помочь может :) Спасибо. Боязнь за целостность данных исчезла. Правда время обработки раз в 50 больше, чем с библиотекой от Java, но похоже выбирать не приходится :( Может еще ZVI что присоветует. Пока попробую произвести обратную инженерию для раскодирования.
KL
 
Прошу прощения, вношу поправку насчет времени: причиной медлительности были операции никак не связанные с данной задачей. На самом деле код Слэна почти втрое быстрее моего старого решения. Теперь остается создать макрос раскодирования :)
KL
 
тормоза в strconv - но байтовый массив можно получить и другими способами - в 50 раз быстрее :)  
 
просто не думал, что скорость тут важна..
Живи и дай жить..
 
я недавно тут тренировался по работе с памятью - подмена строки байтовым массивом  
 
можно поискать - ключ - vba работа с памятью  
 
 
ps  скорее всего и первый член (sr(i+2)) нужно hex-сить
Живи и дай жить..
 
{quote}{login=слэн}{date=08.12.2010 09:44}{thema=}{post}тормоза в strconv - но байтовый массив можно получить и другими способами - в 50 раз быстрее :)  
 
просто не думал, что скорость тут важна..{/post}{/quote}  
Спасибо, так подойдет. Скорость тут важна относительно. Сейчас 164 файла в среднем по 4КБ кодируются за 15 сек. С новым кодом получается 5 сек. А при первой попытке применить новый код, он отработал за 12 мин (а это уже многовато), но, как я и сказал, дело было не в самом решении, а в ошибке в рекурсивном цикле.
KL
Страницы: 1
Наверх