Страницы: 1 2 След.
RSS
Как прочесть "кракозябры", получаемые после копирования-вставки кириллицы из Висты?
 
Тема регулярно всплывает и тонет ввиду долгого отсутствия решения.  
Напоминаю для тех, кто не в курсе.  
Если, работая под Вистой, перед копированием из VBE текста, содержащего кириллицу, не переключить раскладку клавиатуры в RUS, то после вставки в ответ форума (или в "блокнот") получим не читаемые "кракозябры" (см. приаттаченный пример)  
 
Для расшифровки кириллицы, искалеченной в вид типа    
Ýòà ä  
KukLP написал (а я как всегда "дополировал" :) UDF:  
Function TransNumberASC(s$) As String ' http://www.planetaexcel.ru/forum.php?thread_id=26836  
  Dim Arr, i%  
  Arr = Split(Replace(Replace(s, "&#", ";&#"), ";;", ";"), ";")  
  On Error Resume Next  
  For i = 0 To UBound(Arr) - 1  
     If Left(Arr(i), 2) = "&#" And Len(Arr(i)) = 5 And IsNumeric(Right(Arr(i), 3)) Then  
        Arr(i) = Chr(CInt(Right(Arr(i), 3)))  
     End If  
  Next  
  TransNumberASC = Join(Arr, "")  
End Function  
 
Казанский там же предложил VB-скрипт, расшифровывающий искалеченные в такой же вид тексты:  
 
Dim s, s1, v, i, x  
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  
  'MSForms.dataobject, http://www.sql.ru/forum/actualthread.aspx?tid=501769&pg=1  
  .GetFromClipboard  
  s = .GetText  
End With  
With CreateObject("vbscript.regexp")  
  .Global = True  
  .Pattern = "(&#\d\d\d;)"  
  Set v = .Execute(s)  
End With  
For Each x In v  
  s1 = s1 & Mid(s, i + 1, x.FirstIndex - i) & Chr(CLng(Mid(x, 3, 3)))  
  i = x.FirstIndex + x.Length  
Next  
s1 = s1 & Mid(s, i + 1)  
MsgBox s1  
 
К сожалению, на других форумах (например, в Миру у Сержа-007) кириллица вставляется в пост в том же виде, как здесь выглядит в окне ввода - "кракозябрами".  
Это здесь не отобразится (т.к. преобразуется в посте в последовательность типа Ýòà ä), но посмотреть образец можно на: http://www.excelworld.ru/forum/2-419-1  
При этом никаких разделителей не видно, а все символы после вставки в Ёксель имеют одинаковый КОДСИМВ() = 63 ...  
 
Так что проблема расшифровки кириллицы, искажённой так, как в третьем образце примера, так и осталась не полностью решенной
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Пытаюсь "подпилить" VB-скрипт Алексея (Казанского) так, чтобы "переведённый" текст выводился не в MsgBox, а заменял исходные кракозябры в буфере обмена:  
Dim s, s1, v, i, x  
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  
.GetFromClipboard: s = .GetText ' получить значение из буфера обмена  
With CreateObject("VBScript.RegExp")  
.Global = True  
.Pattern = "(&#\d\d\d;)"  
Set v = .Execute(s)  
End With  
For Each x In v  
s1 = s1 & Mid(s, i + 1, x.FirstIndex - i) & Chr(CLng(Mid(x, 3, 3)))  
i = x.FirstIndex + x.Length  
Next  
s1 = s1 & Mid(s, i + 1)  
'.SetText s1: .PutInClipboard ' добавить значение в буфер обмена  
End With  
MsgBox s1  
Не получается.    
Если раскомментировать добавление в буфер, то вылетает по ошибке...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да, поместить текст в буфер обмены почему-то труднее, чем взять его оттуда :)  
Я тоже вчера хотел это сделать, но с ходу не получилось.  
В VBA работает, в VBS - нет.  
Сегодня поискал и выяснил, что люди используют для этого различные объекты:  
1. Internet Explorer - http://forum.script-coding.com/viewtopic.php?id=4324  
Другой метод - http://forums.vandyke.com/showthread.php?t=597 , пост 03-28-2005, 06:16 AM    
Я, правда, не уверен, что если IE не является браузером по умолчанию, то по команде  
Set objHTML = CreateObject("htmlfile")  
будет вызван именно он... надо проверить.  
 
2. Word - http://pkotvety.ru/qa-297d45679cab7ae/kak-rabotat%27-s-buferom-obmena-iz-vbs  
 
3. Самописную DLL - http://www.promsoft.ru/index.php?action=topics&menu_id=885&page_id=22
 
Вот именно: в VBA работает, в VBS - нет.  
Но я извратился в скрипте так чтобы можно было копировать расшифрованный текст - вместо MsgBox поставил InputBox:  
  Dim s, s1, v, i, x  
  With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")    
     .GetFromClipboard: s = .GetText ' получить значение из буфера обмена  
  With CreateObject("VBScript.RegExp")  
     .Global = True  
     .Pattern = "(&#\d\d\d;)"  
     Set v = .Execute(s)  
  End With  
  For Each x In v  
     s1 = s1 & Mid(s, i + 1, x.FirstIndex - i) & Chr(CLng(Mid(x, 3, 3)))  
     i = x.FirstIndex + x.Length  
  Next  
  s1 = s1 & Mid(s, i + 1)  
'      .SetText s1: .PutInClipboard ' добавить значение в буфер обмена  
  End With  
  s = InputBox("", "", s1)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Допилил VBS с использованием IE. Работает, конечно, но задумывается :(  
 
Dim s, s1, v, i, x  
With CreateObject("InternetExplorer.Application")  
.Navigate("about:blank")  
s = .document.parentwindow.clipboardData.GetData("text")  
With CreateObject("vbscript.regexp")  
.Global = True  
.Pattern = "&#\d\d\d;"  
Set v = .Execute(s)  
End With  
For Each x In v  
s1 = s1 & Mid(s, i + 1, x.FirstIndex - i) & Chr(CLng(Mid(x, 3, 3)))  
i = x.FirstIndex + x.Length  
Next  
s1 = s1 & Mid(s, i + 1)  
If v.Count=0 Then  
s = "Кракозябров нет"  
x = vbOKOnly  
Else  
s = "Поместить исправленный текст в буфер обмена?"  
x = vbYesNo  
End If  
If MsgBox(s1,x, s) = 6 Then _  
.document.parentWindow.clipboardData.setData "text", s1  
.Quit  
End With
 
Лёш, так стоит ли если тормозит это юзать?  
Может остановиться на моей последней шлифовке твоего скрипта - с InputBox? Там в отличие MsgBox расшифрованный текст при желании можно просто скопировать если его нужно куда-то потом вставлять.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Поднимаю тему.  
Тут Сергей - KuklP мне подкинул в личку, т.к. не смог найти этот топик, свою новую UDF-ку для исправления кракозябриков типа Ìåãîìåòð  
Ещё не тестировал. Нет времени.  
 
Public Function TransNumberASC2(ByVal S$) As String  
Dim a$, i%, j  
For i = 1 To Len(S) - 1  
a = a & IIf(AscW(Mid(S, i, 1)) <> 32, ChrW(AscW(Mid(S, i, 1)) + 848), " ")  
Next  
TransNumberASC2 = Application.Clean(Trim(a))  
a = ""  
End Function
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Леш, в теме http://www.planetaexcel.ru/forum.php?thread_id=27264 автор подкинул файлик с зябликами, а я ответил ЮДФ в его примере. Там другие каракули, не такие, как на сайте.
Я сам - дурнее всякого примера! ...
 
Название макроса Дмитрия улыбнуло: Hren_to_Normal  
А вообще-то проверил: отлично работает и уверенно расшифровывает оба вида кракозябр - и Äîïîëíèòåëüíûå ñâåäåíèÿ , и Êðåñëî êîìïüþòåðíîå  
только надо чуть подправить чтобы функция сама определяла кодировку "зюковок", а не приходилось ей подбирать в аргументах 1 или 0
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
а по поводу того, что    
"Стоит добавить, что функция была написана для преобразования с листа Excel. Т.е. сначала текст выгружается на лист, а затем уже фукнцией его преобразуем."  
я сначала не обратил внимания и попробовал как обычную ЮДФ-ку заюзать. Отлично получилось. А когда вчитался в пост, так над этой фразой до сих пор морщу извилины... Что бы это значило и какие ограничения накладывает? (правда, признаюсь: код ещё не разбирал, завтра с утра попробую).  
Ещё в идеале из функции бы после придания ей самостоятельности в выборе метода раскодирования скрипт бы сделать чтобы из буфера обмена брал кракозябры, а в инпутбокс (чтобы их можно было при нужде скопировать, а не только читать) выводил расшифрованный текст.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Дмитрий,  
ничего менять даже и не надо.  
Я специально пробовал ваш макрос As Is - в первоисточнике  
Что аргумент задан именно rCell As Range я, естественно, сразу увидел, но решил попробовать и так. Выяснил, что функции листа в данном случае пофигу, как задана переменная.  
А новый ваш вариант сейчас потестирую.  
К стати про использование буфера обмена - в стартовой теме топика я выложил пример Алексея Казанского.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Ну, чтобы вызывать функцию совсем уж откуда угодно, нужно её оформить как скрипт и передавать аргумент/получать результат через буфер обмена.  
С передачей то в скрипт, как тут выяснили, проблем нет, а вот запихнуть из скрипта результат в буфер что-то пока не получилось...    
Может, вы или кто-то ещё из гуру всё-таки допилит до полной юзабильности.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
По мере сил и умения подполировал функцию Дмитрия:  
Function ПОЧИНИТЬ_КИРИЛЛИЦУ(ГЛЮК$)  
  Dim Arr, i%, sTxt$, sSymb$  
  Arr = Split(Replace(Replace(ГЛЮК, "&#", ";&#"), ";;", ";"), ";")  
  If UBound(Arr) > LBound(Arr) Then  
     On Error Resume Next  
     For i = LBound(Arr) To UBound(Arr)  
        If Left(Arr(i), 2) = "&#" And Len(Arr(i)) = 5 And IsNumeric(Right(Arr(i), 3)) Then  
           Arr(i) = Chr(CInt(Right(Arr(i), 3)))  
        End If  
     Next  
     sTxt = Join(Arr, "")  
  Else  
     For i = 1 To Len(ГЛЮК)  
        sSymb = Mid(ГЛЮК, i, 1)  
        If AscW(sSymb) > 255 Then  
           sTxt = sTxt & sSymb  
        Else  
           sTxt = sTxt & Chr(AscW(sSymb))  
        End If  
     Next i  
  End If  
  ПОЧИНИТЬ_КИРИЛЛИЦУ = sTxt  
End Function  
Вроде, покороче стало не в ущерб функциональности. Глюки обоих типов расшифровывает уверенно.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А вот и примерчик с функцией соорудил:
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=28.04.2011 04:54}{thema=}{post}А вот и примерчик с функцией соорудил:{/post}{/quote}  
 
Ура, работает! Я вот пока алгоритм The_Prist приспособил для исправления кракозябриков в выделенных ячейках.
 
roka, отписывайтесь в своих темах.
 
{quote}{login=}{date=28.04.2011 05:10}{thema=}{post}roka, отписывайтесь в своих темах.{/post}{/quote}  
Хм, а утром меня сюда направили. Типа закрывай свою лавочку, тема там.
 
{quote}{login=roka}{date=28.04.2011 05:14}{thema=Re: }{post}{quote}{login=}{date=28.04.2011 05:10}{thema=}{post}roka, отписывайтесь в своих темах.{/post}{/quote}  
Хм, а утром меня сюда направили. Типа закрывай свою лавочку, тема там.{/post}{/quote}Ну так и напишите там, что вопрос решается (решён ) здесь
 
{quote}{login=}{date=28.04.2011 05:24}{thema=Re: Re: }{post}{quote}{login=roka}{date=28.04.2011 05:14}{thema=Re: }{post}{quote}{login=}{date=28.04.2011 05:10}{thema=}{post}roka, отписывайтесь в своих темах.{/post}{/quote}  
Хм, а утром меня сюда направили. Типа закрывай свою лавочку, тема там.{/post}{/quote}Ну так и напишите там, что вопрос решается (решён ) здесь{/post}{/quote}  
Какой Вы безымянный и грозный, ух.........  
Пойду отпишусь
 
Сообщение было моё - не залогинился. И говорил я совсем про другую тему.
 
Если уж модераторы в анонимы подались...:-)
Я сам - дурнее всякого примера! ...
 
{quote}{login=KukLP}{date=28.04.2011 08:34}{thema=}{post}Если уж модераторы в анонимы подались...:-){/post}{/quote}  
Серёга, ты лучне своё мнение про метод расшифровки кракозябр выскажи...  
Может, RegExp прицепить лучше (я его не знаю) или как-то ещё дополировать?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Леш, да все отлично, куда еще полировать. Хотя.. у меня с этим проблем нет, все копируется в любой раскладке корректно, так что я особого внимания этому не уделял. Так, мимоходом на лету, чтоб прочитать пост, написал первую, а потом вспомнил, читая тему roka, что ты где-то тоже писал о других зябликах, попробовал Щтирлицем. Не берет, по ходу набросал вторую. Но все равно, нужно искать способ более радикальный, патч для системы, как у меня в ХР. Чтоб таких ситуаций не возникало. Тогда мож и я решусь на семерку перелезть:-) А вообще, подумываю поменять машину. Эта уже томозит безбожно. Не знаю, уже поотключал все, что можно службы, типа индексации, JQS и т.д. И все равно время от времени вешает машину минут на 5. Ощущение, что винт форматирует по Low level. Проц при этом не загружен, только винт:-( М-да... Чет я не по теме разнылся.  
 
Опа!  
99966
Я сам - дурнее всякого примера! ...
 
Серёга, к сожадению похоже, что на патч системы, как это было сделано в ХРюше, все знатоки забили.  
Вот и приходится полировать костыли :)  
Уж лучше костыли чем кракозябры.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Во, блин...  
Ещё один тип искажения кириллицы обнаружил...  
Вчера оформлял в Английском интернет-магазине покупку через PayPal по карте Visa, которая была заведена через QIWI… А там оказался русский адрес.  
Так адрес в интернет-магазин у Инглишей пришёл вместо моего:  
Russia, Москва, 125445, Ленинградское ш.  
пришёл как:  
Russia, Москва, 125445, Ленинградское ш.  
Пришлось переписываться с менеджером, присылать транслитерацию.  
Посчитал с утра коды символов и выяснил, что в них произошёл сдвиг на +848.  
Не стал разбираться почему, что за число... Просто подправил функцию.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Для того, чтобы "кракозябры" не возникали при вашей работе, KukLP где-то нарыл следующий метод:  
1. В папке system32 удаляем файл c_1252.nls  
2. Там же делаем копию файла c_1251.nls и переименовываем её в c_1252.nls  
3. Перезагружаемся. БАЛДЕЕМ!  
Главная проблема - суметь удалить имеющийся файл c_1252.nls  
Виста, маниакальная сволочь, не даёт это сделать даже администратору. А стать Full Admin я не сумел.  
Зато по совету KukLP я попробовал удалить файл с помощью программы Unlocker ( http://www.emptyloop.com/unlocker/#download ) - получилось!
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Видел тему, качал локер, но Вин7 не сдалась. Так и не дала разблокировать файл (кстати локер, кажется, и не работает под 7). Грузится с ЛайвСД не захотел:)
 
Игорь, персонально :-) <BR>http://yandex.ru/yandsearch?text=unlocker+%D0%B4%D0%BB%D1%8F+windows+7&lr=22
 
Спасибо:) Но не сильно и надо, уже привык следить за раскладкой. И Пунто у меня не прижился, а многим нравится:)
 
Ну, Анлокер и для других целей может пригодиться... <BR>= = = <BR>202<STRONG>67</STRONG>
Страницы: 1 2 След.
Наверх