Тема регулярно всплывает и тонет ввиду долгого отсутствия решения. Напоминаю для тех, кто не в курсе. Если, работая под Вистой, перед копированием из 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 ...
Так что проблема расшифровки кириллицы, искажённой так, как в третьем образце примера, так и осталась не полностью решенной
Пытаюсь "подпилить" 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") будет вызван именно он... надо проверить.
Вот именно: в 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!!!)
Название макроса Дмитрия улыбнуло: 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!!!)
{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. Проц при этом не загружен, только винт:-( М-да... Чет я не по теме разнылся.
Серёга, к сожадению похоже, что на патч системы, как это было сделано в ХРюше, все знатоки забили. Вот и приходится полировать костыли :) Уж лучше костыли чем кракозябры.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Во, блин... Ещё один тип искажения кириллицы обнаружил... Вчера оформлял в Английском интернет-магазине покупку через PayPal по карте Visa, которая была заведена через QIWI… А там оказался русский адрес. Так адрес в интернет-магазин у Инглишей пришёл вместо моего: Russia, Москва, 125445, Ленинградское ш. пришёл как: Russia, Москва, 125445, Ленинградское ш. Пришлось переписываться с менеджером, присылать транслитерацию. Посчитал с утра коды символов и выяснил, что в них произошёл сдвиг на +848. Не стал разбираться почему, что за число... Просто подправил функцию.
Для того, чтобы "кракозябры" не возникали при вашей работе, 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). Грузится с ЛайвСД не захотел:)