Коды символов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Коды символов

Сообщение Алексей.Ф. » 21.12.2006 (Чт) 15:49

Здравствуйте, уважаемые участники форума.
У меня такой вопрос.
Имеется текст, на иностранном языке (греческом), набранный определённым шрифтом.
Чтобы этот текст правильно отображался в некотором приложении, необходимо поменять шрифт. Но, в греческом языке, если просто выделить текст, допустим, в Worde, и сменить шрифт, часть букв не отображаются. Я сделал такую простенькую программку, которая определяет код символа в разных шрифтах и при необходимости, если эти коды не совпадают, меняет код символа и таким образом, текст любым шрифтом отображается правильно. Всё хорошо, пока используются не Юникодные шрифты. А вот если взять Юникодный,то функция, которая возвращает код символа: Asc(String) или AscW(String), для любого символа выдаёт значение 63! Получается, что узнать код таких символов средствами VB невозможно:cry:. Кто знает как тут можно выкрутиться? Помогите, очень надо!!!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2006 (Чт) 17:19

Смотреть тебе надо функцию StrConv...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.12.2006 (Чт) 21:20

63 -- это код вопросительного знака. Т.е. символа, который подставляется при преобразовании из Юникода в ANSI вместо непереводимых символов.
Изображение

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 12:42

Andrey Fedorov писал(а):Смотреть тебе надо функцию StrConv...

Давно уже смотрел. Но, ничего она не конвертирует.

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 12:44

tyomitch писал(а):63 -- это код вопросительного знака. Т.е. символа, который подставляется при преобразовании из Юникода в ANSI вместо непереводимых символов.

Так как всё-таки, увидеть код юникодных символов?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 12:47

Алексей.Ф. писал(а):
Andrey Fedorov писал(а):Смотреть тебе надо функцию StrConv...

Давно уже смотрел. Но, ничего она не конвертирует.


Дык по твоему, в таком случае нафига она - для красоты?

Изначально у тебя символы в чем? В текстовом файле али как?
Куда их выводить хочешь - в TextBox?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.12.2006 (Пт) 12:51

Алексей.Ф. писал(а):Так как всё-таки, увидеть код юникодных символов?

Если ты не понял, переведу ответ tyomitch-а. В этот момент это УЖЕ не unicode-символы, а знак вопроса.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 12:57

alibek писал(а):
Алексей.Ф. писал(а):Так как всё-таки, увидеть код юникодных символов?

Если ты не понял, переведу ответ tyomitch-а. В этот момент это УЖЕ не unicode-символы, а знак вопроса.


Да я понял.

На его месте я бы дал кусочек кода с примером откуда берутся данные и куда их надо девать - так чтобы было ясно не только телепатам, на каком месте у него гробится unicode... А так - телепатируем...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.12.2006 (Пт) 12:58

А я и не тебе это говорил :)
Lasciate ogni speranza, voi ch'entrate.

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 13:03

Andrey Fedorov писал(а):Дык по твоему, в таком случае нафига она - для красоты?

Изначально у тебя символы в чем? В текстовом файле али как?
Куда их выводить хочешь - в TextBox?

Текст в текстовом файле или в текстбоксе или в РичТекстБоксе.
Допустим текст на греческом языке, набранный юникодным шрифтом.
Кладём строчку из файла или текстбокса или рич текстбокса в переменную:

Код: Выделить всё

Dim mytext As String
mytext = RichTextBox1.Text
RichTextBox2.Text = StrConv(mytext, vbFromUnicode)

и получаются какие-то крякозябры. Моожет я что не так делаю?

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 13:08

alibek писал(а):
Алексей.Ф. писал(а):Так как всё-таки, увидеть код юникодных символов?

Если ты не понял, переведу ответ tyomitch-а. В этот момент это УЖЕ не unicode-символы, а знак вопроса.

То, что это уже не символы, а знаки вопроса, и так понятно.
Не понятно, как увидеть код юникодных символов (любых).

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 13:19

Алексей.Ф. писал(а):Не понятно, как увидеть код юникодных символов (любых).


Код: Выделить всё
Dim m() As Byte, s As String

s = "Текстик"
m = s


Сможешь посмотреть содержимое массива?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 13:24

Алексей.Ф. писал(а):Моожет я что не так делаю?


См ниже что ты делаешь:

Код: Выделить всё
Public Sub Main()
    Dim s As String, m() As Byte, i As Long
    s = "Проверочка"
   
    m = s
    Debug.Print vbCrLf & "=========="
    For i = 0 To UBound(m) Step 2
        Debug.Print Mid$(s, i \ 2 + 1, 1), m(i + 1), m(i)
    Next i
   
    m = StrConv(s, vbFromUnicode)
   
    Debug.Print vbCrLf & "----------"
    For i = 0 To UBound(m)
        Debug.Print Mid$(s, i + 1, 1), m(i), Asc(Mid$(s, i + 1, 1))
    Next i
End Sub
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 14:06

Andrey Fedorov писал(а):
Код: Выделить всё
Dim m() As Byte, s As String

s = "Текстик"
m = s


Сможешь посмотреть содержимое массива?

Andrey Fedorov писал(а):
См ниже что ты делаешь:

Код: Выделить всё
Public Sub Main()
    Dim s As String, m() As Byte, i As Long
    s = "Проверочка"
   
    m = s
    Debug.Print vbCrLf & "=========="
    For i = 0 To UBound(m) Step 2
        Debug.Print Mid$(s, i \ 2 + 1, 1), m(i + 1), m(i)
    Next i
   
    m = StrConv(s, vbFromUnicode)
   
    Debug.Print vbCrLf & "----------"
    For i = 0 To UBound(m)
        Debug.Print Mid$(s, i + 1, 1), m(i), Asc(Mid$(s, i + 1, 1))
    Next i
End Sub

Если не трудно, можешь поподробней?
Я, честно говоря, в слабовато волоку.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 14:14

Алексей.Ф. писал(а):Если не трудно, можешь поподробней?
Я, честно говоря, в слабовато волоку.


Ну куда уж подробней - тут аж кусок кода показывающий что происходит. Ну может кто другой еще объяснить сможет - не знаю...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 14:34

Andrey Fedorov писал(а):
Ну куда уж подробней - тут аж кусок кода показывающий что происходит. Ну может кто другой еще объяснить сможет - не знаю...


Ну, хотя бы , прокомментируй, то, что ты привёл. Не все ж кандидаты VB наук. А то, зачем мне этот кусок кода, если я всё равно не разберусь, как его использовать.
Пожалста.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 14:38

А ты сам разберись - это же самый примитив, азы.
Ну не жевать же все до кашицы...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 22.12.2006 (Пт) 15:20

автору: почитай это http://vbstreets.ru/VB/Articles/66364.aspx

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 16:30

Andrey Fedorov писал(а):А ты сам разберись - это же самый примитив, азы.
Ну не жевать же все до кашицы...

Когда я разобрался, понял, что делал тоже самое, только проще.
Но, это не решает проблемы. Пока используются русские или латинские символы, всё отлично. Я это и писал в первом сообщении темы. Но, когда начинаю использовать любой другой шрифт (греческий и т.д.), то он вместо кода символа, выдаёт код вопросительного знака!

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 22.12.2006 (Пт) 16:32

Dim mytext As String
mytext = RichTextBox1.Text

вот тут уже все и преобразуется :!:

PS
RichTextBox1.TextRTF - вернет тебе твои коды символов , но парсить самому придется
Последний раз редактировалось Konst_One 22.12.2006 (Пт) 16:41, всего редактировалось 1 раз.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 16:38

Алексей.Ф. писал(а):Я это и писал в первом сообщении темы. Но, когда начинаю использовать любой другой шрифт (греческий и т.д.), то он вместо кода символа, выдаёт код вопросительного знака!


Ну и какой CharSet у фонта у тебя выставлен при этом?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 16:39

Konst_One писал(а):автору: почитай это http://vbstreets.ru/VB/Articles/66364.aspx

Как я понял из этой статьи, решить мой вопрос с помощью VB или невозможно или очень сложно:
...
Поддержка Юникода в VB6 как будто бы есть: хранение и обработка юникодных строк допускается безо всяких ограничений.

Хотя основа VB6 – технология COM/ActiveX – также позволяет передавать в свойствах и методах классов юникодные строки без ограничений, ни один из контролов в стандартной поставке VB6 этой возможностью не пользуется. Чтобы вводить и выводить юникодные строки, нужно либо заморачиваться с API, либо пользоваться контролами третьих фирм (платными и/или бажными)...

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 22.12.2006 (Пт) 16:41

Konst_One писал(а):Dim mytext As String
mytext = RichTextBox1.Text

вот тут уже все и преобразуется :!:

Попробуй.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 16:43

Алексей.Ф. писал(а):Как я понял из этой статьи, решить мой вопрос с помощью VB или невозможно или очень сложно


Не читая этой статьи (совершенно не нужной для данного вопроса) скажу - что решить можно. Тебе нужен просто вывод? В TextBox сойдет?

Кусочек "греческого" файла выложи...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 16:44

Алексей.Ф. писал(а):Но, когда начинаю использовать любой другой шрифт (греческий и т.д.), то он вместо кода символа, выдаёт код вопросительного знака!


Ну не "любой другой", а шрифт другой кодовой страницы, отличный от текущей локали.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 22.12.2006 (Пт) 16:45

что пробовать :?:

если ты желаешь писать юникодную программу, в которой можно вводить в неком твоем контроле текст на разных языках в одном документе, то тебе по-любому придется разбираться с юникодом. простых решений на этом пути тебя не ждет, а подводных камней будет много :wink:

PS
позволю себе еще раз выложить эту полезную ссылку, которую я уже выкладывал когда-то: http://www.cyberactivex.com/UnicodeTutorialVb.htm

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2006 (Пт) 16:52

Konst_One писал(а):если ты желаешь писать юникодную программу, в которой можно вводить в неком твоем контроле текст на разных языках в одном документе, то тебе по-любому придется разбираться с юникодом. простых решений на этом пути тебя не ждет, а подводных камней будет много :wink:


Судя по его первому письму требуется лишь отображение, а это достаточно просто. Правда тут пускай сам уточняет что конкретно ему нужно - что на входе и что должно быть на выходе...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 22.12.2006 (Пт) 16:58

согласен, вывод сделать проще, чем ввод, но автор похоже так и не может нам огаласить свою задачу :wink:

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 23.12.2006 (Сб) 14:37

Попробую объяснить ещё раз.
Имеется текст достаточно большого объёма, набранный не кириллицей и не латиницей (в данном конкретном случае, на греческом, но это не важно, потому что есть и другие тексты, на других языках).
Мне необходимо открыть этот текст с помощью одной программы, но, когда открываю этот текст, часть символов отображается неправильно. Тексты же набранные другим шрифтом (в данном случае шрифт Symbol) отображаются правильно. Мне необходимо поменять шрифт в тексте. Если просто взять, к примеру в Worde, и сменить шрифт, то, опять же, часть символов не отображается. Вручную набирать заново - на каждый текст будет уходить по 3-4 недели.
Для некоторых фонтов я делал так: с помощью функции Asc узнавал код символов у обоих шрифтов и программа подменяла код символа одного шрифта на на другой:
Код: Выделить всё
Dim ch As String, pos1 As Long, qq As String, v1 As String, w1 As String
pos = 1
pos1 = 1
rt = RichTextBox1.Text
For pos = 1 To Len(rt)
rb = Mid(rt, pos, 1)
v = Asc(rb)
If v = 121 Or v = 118 Or v = 113 Then
If v = 121 Then w = 113
If v = 118 Then w = 86
If v = 113 Then w = 121
Else
w = v
End If

For pos1 = 1 To Len(rct)
rct1 = Mid(rct, pos1, 1)
v1 = v1 + rct1
ch = ChrW(Val(v1))
Next pos1
RichTextBox2.Text = RichTextBox2.Text + ch

Но, для многих фонтов, ка я уже писал, такая фишка не проходит!
А нужно мне всё это для того, чтобы можно было проанализировать любой текст, на любом языке на предмет частоты встречаемости слов в данном тексте и сортировки слов по частоте встречаемости в тексте.
Есть такая программка, но, она как я сказал, понимает не все шрифты. Вот такая беда. Я и подумал, что сделать программу, которая меняет шрифты, проще, чем ту, которая анализирует текст по частоте встречаемости слов. Оказалось не проще.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.12.2006 (Сб) 22:17

Объясняем ещё раз.
Если приложить нам тестовый пример, и не полагаться на нашу телепатию, то дело сразу же пойдёт гораздо быстрее.
Изображение

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 99

    TopList  
cron