Помогите понять как работает UCase на низком уровне

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

Помогите понять как работает UCase на низком уровне

Сообщение Pantalone » 06.03.2009 (Пт) 23:37

Хочется понять каким образом в функции UCase определяется что изменяемый символ является буквой и следовательно можно найти ее вариант в верхнем регистре?
Надо это для написания собственной функции подобной UCase. Но фигня в том что надо знать коды символов которые имеют свои двойники в другом регистре, т.е. для английского алфавита A = 65, a = 97, и определив, что если символ у нас находится в диапазоне от 97 до 122, можно получить его аналог в верхнем регистре отняв от значения число 32. Но как быть с другими языками? Как функция узнает что символ 224 это русская буква "а" и значит можно получить "А"?
Надеюсь понятно объяснил :roll:

На ум пока приходит следующее, определять это через instr(1,"a",chr(asc("a")-32),vbTextCompare)=1, но всегда ли разница между регистрами равна 32?

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Помогите понять как работает UCase на низком уровне

Сообщение Gemini » 06.03.2009 (Пт) 23:48

Ну как я понимаю 32- это кол-во букв в алфавите.... (от 0 до 32 нижний регистр, после 32 верхний )
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Re: Помогите понять как работает UCase на низком уровне

Сообщение Pantalone » 06.03.2009 (Пт) 23:52

В разных алфавитах могут быть разные количества букв.
Короче я думаю вот такой вариант меня спасет и всегда даст мне знать что имею дело с буквой, которую можно преобразовать :)
InStr(1, UCase(str), LCase(str), vbTextCompare)

Хотя не, надо же такой бред сморозить :D

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помогите понять как работает UCase на низком уровне

Сообщение Хакер » 07.03.2009 (Сб) 0:16

но всегда ли разница между регистрами равна 32?

Код: Выделить всё
Dim sAlways As String
Dim sNotAlways As String

sAlways = "Конечно всегда."
sNotAlways = "Ё-моё, не всегда :("

MsgBox iif((Asc(Mid$(sNotAlways, 5, 1)) - Asc(Mid$(sNotAlways, 1, 1))) = 32, sAlways, sNotAlways)


Как преобразование делает именно UCase можешь посмотреть, покопавшись в rtcUpperCaseBstr.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList