|
MySQL.RU - Webboard
Вернуться
win32, cp1251, upper() (vitek) 04/01/2002 - 07:07:26
Re: win32, cp1251, upper() (walrus) 04/01/2002 - 13:17:27
Re: win32, cp1251, upper() (vitek) 04/01/2002 - 14:39:16
Re: Так это - англичане есть? (vitek) 05/01/2002 - 15:31:19
Re: Est konechno (Антон) 06/01/2002 - 02:40:48
Re: Est konechno (vitek) 06/01/2002 - 05:15:32
Re: win32, cp1251, upper() (Andrew) 07/01/2002 - 04:43:36
Re: win32, cp1251, upper() (vitek) 07/01/2002 - 13:42:04
Re: Est konechno (vitek) 17/01/2002 - 11:54:21
> Original message text:
> From: vitek - 04/01/2002 - 07:07:26
> Subject:win32, cp1251, upper()
> -----------------
> В коде MySQL'я есть строки:
>
> #ifdef __WIN__
> #include <ctype.h>
> #endif
>
> и
>
> #ifndef __WIN__
> #define _toupper(c) (char) my_to_upper[(uchar) (c)]
> #define _tolower(c) (char) my_to_lower[(uchar) (c)]
> #define toupper(c) (char) my_to_upper[(uchar) (c)]
> #define tolower(c) (char) my_to_lower[(uchar) (c)]
> ...
> #endif /* __WIN__ */
>
> Т.е. грубо говоря за функции UPPER, LOWER и им подобные
> в MySQL-Win32 отвечает не MySQL, а библиотеки VC++
>
> Пример программы на VC++:
>
> #include <stdio.h>
> #include <ctype.h>
> #include <locale.h>
>
> int main(void)
> {
> char str[] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
> int index = 0;
> char *ptr;
>
> ptr = setlocale( LC_ALL, "");
> printf( "%s\n", ptr);
>
> printf( "%s\n", str);
>
> ptr = str;
> do {
> *ptr = toupper( *ptr);
> } while( *ptr++);
>
> printf( "%s\n", str);
>
> return 0;
> }
>
> Результат выполнения:
>
> [Win32-Debug]
> Russian_Russia.1251
> абвгдеёжзийклмнопрстуфхцчшщъыьэюя
> АБВГДЕёжЗийклмнопрстуФхцЧшЩъыьэюя
>
> [Win32-Release]
> Russian_Russia.1251
> абвгдеёжзийклмнопрстуфхцчшщъыьэюя
> АБВГДЕёЖЗиЙКЛМНОпРСТУФХцЧшщъыьэюя
>
>
> Думаю, вывод понятен.
>
>
From: Andrew - 07/01/2002 - 04:43:36
Subject:win32, cp1251, upper()
-----------------
Разработчиков MySQL можно понять. Они положились на Microsoft, т.е. ф-ции toupper() (tolower()) должны в соответствии с региональными установками менять регистр. НО! эти функции MicroSoft сделал очень странно, вот пример из MSDN:
/* TOUPPER.C: This program uses toupper and tolower to
* analyze all characters between 0x0 and 0x7F. It also
* applies _toupper and _tolower to any code in this
* range for which these functions make sense.
*/
#include <conio.h>
#include <ctype.h>
#include <string.h>
char msg[] = "Some of THESE letters are Capitals\r\n";
char *p;
void main( void )
{
_cputs( msg );
/* Reverse case of message. */
for( p = msg; p < msg + strlen( msg ); p++ )
{
if( islower( *p ) )
_putch( _toupper( *p ) );
else if( isupper( *p ) )
_putch( _tolower( *p ) );
else
_putch( *p );
}
}
читаем начальное замечание: This program uses toupper and tolower to analyze all characters between 0x0 and 0x7F.
т.е. используется только 7-битные коды, ни о каких русских кодировках и не может идти речи..... а вот ф-ции strlwr() и strupr() работают правильно, прада ориентированы на работу со строками....
И еще, таблицы кодировок, поставляемые с mysql неправильные (во всяком случае для cp1251)...
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
1577
|
|