Печать Unicod символов

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

Печать Unicod символов

Сообщение Lotreck » 01.04.2008 (Вт) 13:04

Предисловие:
Открыть Таблицу символов (Пуск\Программы\Стандартные\Служебные\Таблица символов),
установить шрифт Arial, найти символ расположенный на пересечении пятой строки и девятой колонки, запомнить его.
Теперь вопрос:
Каким образом по команде кнопки расположенной на форме в текстовом окне расположенном на той же форме, отобразить символ находящийся на пересечинии пятой колонки и девятой строки Таблицы символов?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 01.04.2008 (Вт) 14:11

На пересечении пятой строки и девятой колонки лежит аглицкая 'y'.

А если ты имел в виду знаки, типа ©, ®, и.т.п. то в таблице символов в нижнем правом углу написано, как его получить.
label:
cli
jmp label

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 01.04.2008 (Вт) 14:28

У меня в этом месте находится символ æ. Вообще-то я имел ввиду любой из 700 символов находящихся в таблице, а так же те которые
могут быть созданы самостоятельно и подключены.
Как их вставить в код я не обнаружил.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.04.2008 (Вт) 14:29

Функции Chr, ChrW
Весь мир матрица, а мы в нем потоки байтов!

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 01.04.2008 (Вт) 23:41

Не могли бы показать в коде как выглядит применение этой функции
для символов æ, или Ћ, или ↕.

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 01.04.2008 (Вт) 23:52

Код: Выделить всё
Dim char As Long
char = CLng(Asc("Ћ"))
MsgBox Chr(char) & "/" & Chr(142)

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 02.04.2008 (Ср) 6:18

А цифры 142 что означают?

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 02.04.2008 (Ср) 6:30

И откуда брали сам символ, из таблицы символов или из цитаты на форуме, имеет значение.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.04.2008 (Ср) 9:46

А цифры 142 что означают?

ascii-код символа Ћ
И откуда брали сам символ, из таблицы символов или из цитаты на форуме, имеет значение.
Какое?
Лучший способ понять что-то самому — объяснить это другому.

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 02.04.2008 (Ср) 10:37

Вы привели некорректный пример, выбрав из предложенных симвов
тот что имеет ASCII кодировку. А как быть с символом æ который имеет Unicode кодировку. Они просто не вставляются в код программы и как заставить программу их распознавать непонятно.

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

Сообщение Konst_One » 02.04.2008 (Ср) 10:41

ChrW()
что значит?
как заставить программу их распознавать

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 02.04.2008 (Ср) 11:22

Чтобы воспользоваться функцией ChrW() как минимум надо имеметь числовое значение кода, чтобы было что вставлять. Где взять это значение для символа æ мне неизвестно. Если вы в курсе поделитесь
информацией буду благодарен, особенно если это будут не обобщенные рассуждению а конкретный код, желательно проверенный.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.04.2008 (Ср) 11:29

Код можно взять из 1) той же таблицы символов, 2) непосредственно отсюда, из форума.
1)U+00E6 -> &HE6 = 230
2)Скопипасть юникодный символ (æ) туда, куда ты пишешь сообщение, нажми предварительный просмотр, увидишь там же вместо символа код &# 230;
Лучший способ понять что-то самому — объяснить это другому.

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 02.04.2008 (Ср) 13:59

Откуда взялось число 230
U+00E6 понятно, из таблицы. А остальное (->&HE=230)?
Объясните пожалуйста.
И еще почему ChrW () не работает. Не СhrW(230), не ChrW(U+00E6), не ChrW(&#230).

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.04.2008 (Ср) 14:10

Lotreck писал(а):Откуда взялось число 230
U+00E6 понятно, из таблицы. А остальное (->&HE=230)?
Объясните пожалуйста.
И еще почему ChrW () не работает. Не СhrW(230), не ChrW(U+00E6), не ChrW(&#230).

U+00E6 это есть &HE6 в шестнадцатеричной системе, оно же 230 в десятичной.
ChrW(U+00E6) и ChrW(&#230) работать точно не будут, а вот СhrW(230) или СhrW(&HE6) работать в принципе будут, только вот вывести это надо туда, где поддерживается Unicode
Весь мир матрица, а мы в нем потоки байтов!

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 02.04.2008 (Ср) 14:16

Загляни сюда http://www.vbnet.ru/vbguide

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 15:34

chrW не поможет. Должно помочь TextOutW. (но только в текстовом поле вывести такой знак не удасться - можно только на чём-нибудь рисовать)

А знаки, которые ты попросил привести в качестве примеров, не удачны, потому что их код меньше 256, то есть уникод для них не нужен.

Вот год, он работает. Не знаю, как сделать грамотно, но общий подход приблизительно такой (по крайней мере, рыть нужно в этом направлении):

Код: Выделить всё
Option Explicit
Private Declare Function TextOut Lib "gdi32" Alias "TextOutW" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long

Private Sub Form_Click()
Dim s As String, b() As Byte
ReDim b(1)

'Пишем знак с кодом 038f

b(0) = &H8F 'вторая часть 8f
b(1) = &H3 'первая часть 03
'Вообще-то, тут надо как-то присандалить КопимМемери!

s = StrConv(b, vbUnicode)
TextOut hdc, 10, 10, s, 1

End Sub

Private Sub Form_Load()

   FontName = "Verdana" ' нужно установить шрифт, который бы поддерживал уникод
   ScaleMode = 3
   FontSize = 40
End Sub

Надеюсь, уважаемые гуру подскажут, как всё это сделать в божеском виде

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.04.2008 (Ср) 16:07

Откуда взялось число 230
U+00E6 понятно, из таблицы. А остальное (->&HE=230)?
:shock: Oh my god! Программист (программист ли?) не знает шестнадцатеричного счисления!
&H (буква h - первая в слове "hexadecimal", сиречь "шестнадцатеричный") - префикс для записи оных чисел в VB. U+00E6 -> &HE6 - элементарная логика. E6 = 230 - это преобразование умеет делать калькулятор.
Лучший способ понять что-то самому — объяснить это другому.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 18:27

Antonariy
Если это ко мне, то нет, не программист. Но что такое шестнадцатиричная система, вообще-то представляю. Именно поэтому &he6 не подходит в качестве примера - это число вполне влазит в один байт, а значит для уникода такой знак не характерен.

Я привёл пример для знака с кодом &h038f , это Ώ Чтобы один знак занимал два байта.

Код, который я привёл, работает (см. вложение), просто он не причёсан. Какие хотите вывести знак? Ну например, ₤ - это &h20a4

b(0) = &ha4 'вторая часть a4
b(1) = &h20 'первая часть 20
' (дальше так же)

Если бы в данный момент мне нужно было выводить строки в уникоде, я бы и сам причесал свой пример. Но сейчас я разбираться не буду. А направление на TextOutW однозначно верное - другого способа вывести строку в уникоде просто нет.
Вложения
UniStr.zip
Вывести строку в уникоде (непричёсанный код)
(1.6 Кб) Скачиваний: 157

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 02.04.2008 (Ср) 21:34

Я был не прав - chrw() работает. Но только если присваивать его не строке, а массиву байтов. Почему, не знаю :oops:

Вот так работает (выводится ₤ ):
Код: Выделить всё
Dim s As String, b() As Byte
'Пишем знак с кодом 20A4 (Lira Sign)
b = ChrW(&H20A4)
s = StrConv(b, vbUnicode)
TextOut hdc, 10, 10, s, 1


А вот так, почему-то, нет (выводится квадратик). Хотя, вроде бы, должно быть то же самое:
Код: Выделить всё
Dim s As String, b() As Byte
'Пишем знак с кодом 20A4 (Lira Sign)
s = ChrW(&H20A4)
s = StrConv(s, vbUnicode)
TextOut hdc, 10, 10, s, 1
' не написался  :(


Кто-нибудь может объяснить, почему? Разве строка и байтовый массив - не одно и тоже?

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 02.04.2008 (Ср) 23:25

Я тоже не программист, осваиваю VB по по книжкам второй месяц и описания програмного перевода шестнадцетеричного счисления в десятичное ни в одной не встретил, отсюда и вопрос.
Вопрос к arthur2. Будет ли ваш код работать для символов созданных самостоятельно с помощью Eudcedit.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 03.04.2008 (Чт) 0:36

Lotreck
Что такое Eudcedit я не знаю. Код будет правильно работать, если:
1. Известно правильное значение символа.
2. Для вывода используется шрифт, в котором для этого значения есть знак.

То есть, если ты собираешься вывести строку на санскрите, нужно не только узнать коды нужных знаков, но и использовать шрифт, в котором знаки для санскрита есть.

Скажем, если написать в ворде следующий текст:
العربية
Azərbaycan
Català
Česky
Ελληνικά
فارسی
עברית
Lëtzebuergesch
Norsk (bokmål)
Português
Română
Slovenčina
Slovenščina
Türkçe
اردو
Tiếng Việt
ייִדיש
Bân-lâm-gú
(скопировал списко языков из википедии)

затем сохранить в файл .txt, указав кодировку юникод, а затем прочитать этот файл в строку (отбросив два первых байта - это просто указание на кодировку), то весь этот списочек можно спокойненько вывести на форму.
Вложения
UniStr2.zip
Чтение файла в уникоде
(2.43 Кб) Скачиваний: 163

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 03.04.2008 (Чт) 6:38

Eudcedit - редактор личных символов.
Про Vista не знаю, для XP : Пуск/Выполнить/Eudcedit

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 03.04.2008 (Чт) 9:55

Да, я проверил - с этой Eudcedit, со знаками, в ней нарисованными, всё нормально работает. Любопытная, кстати, програмка.

Но символ, который ты нарисуешь, просто связывается с шрифтами на твоей машине, а не встраивается в шрифт. Так что самодельные знаки, кажется, только на твоей машине будут работать.

Проверить, кстати, было совсем не сложно - чего сам-то не проверил? Русуем знак с кодом &he000 (все самодельные знаки начинаются с E и больше), подставляем в пример:

b = ChrW(&HE000)
s = StrConv(b, vbUnicode)
TextOut hdc, 10, 10, s, 1

Вуаля! 8)

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 03.04.2008 (Чт) 11:10

Мне чтобы разобраться что к чему слишком много времени уходит.
Тут знающие люди еще один вариант посоветовали на эту же тему. Для моего уровня слишком сложно, может кто посмотрит что это за штука и как ей пользоваться.
http://www.planet-source-code.com/vb/sc ... 8&lngWId=1

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 03.04.2008 (Чт) 13:51

Да, пример вроде хороший. Но в том варианте, в котором он там лежит, всё посыпалось и ничего не запустилось.

Ручками вытащил оттуда унитексбокс. В код вникать не обязательно (я не стал, для меня это тоже тёмный лес). Всё и так работает, как с обычным текстбоксом.

А разбираться за тебя, если что, ни кто не будет. Посоветовать могут, а глубоко копать не станут. Если конечно кого-нибудь та же тема не заинтересует. Иногда спросить и дожидаться ответа - дольше выходит, чем самому докопаться.
Вложения
UniTextBox.zip
Уникод Текстбокс
(27.58 Кб) Скачиваний: 182
Артур
 
   

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Сообщение Lotreck » 03.04.2008 (Чт) 23:12

Всем спасибо, дальше буду копать сам.


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

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

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

    TopList