Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




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, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
1577



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |