2013-07-28 4 views
1

Я пытаюсь реализовать функцию, которая преобразует char * в wchar_t *. Но проблема в том, что wprintf показывает другой результат. Что я делаю не так?char * to wchar_t * реализация функции

wchar_t *toWchar(char *data) 
{ 
    if(!data) 
    { 
     return NULL; 
    } 

    int size = strlen(data); 
    if(!size) 
    { 
     return NULL; 
    } 

    char *temp = (char *)malloc(size * 2); 
    if(!temp) 
    { 
     return NULL; 
    } 

    int j = 0; 
    for(int i = 0; i < size; i++) 
    { 
     temp[j++] = data[i]; 
     temp[j++] = '\0'; 
    } 

    return (wchar_t *)temp; 
} 

РЕДАКТИРОВАТЬ: основная функция:

int main() 
{ 
    wchar_t *temp = toWchar("hello, world!"); 
    if(temp) 
     wprintf("%ls\n", temp); 
    return 0; 
} 
+2

Какие кодировки вы используете? Какая кодировка для char и какая кодировка для wchar_t? Ваш код может работать, если символ ASCII. И обратите внимание, что вам нужно добавить нулевой терминатор. –

+0

Woohoo, так много проблем! Не могли бы вы дать мне подсказки, что делать? Я просто начинаю программировать, я не знаю, какую кодировку я использую. Если эта информация поможет вам, я использую обычный английский язык как локаль на Linux-боксе. – user2399415

+0

Вам нужно выяснить, какие кодировки вы используете. Почему вы хотите конвертировать в wchar_t? Почему вы не используете библиотечные функции? –

ответ

2

В качестве отправной точки; НКУ даст вам тип платформы зависит WCHAR/размер следующим образом:

echo "" | gcc -E - -dM | grep WCHAR 

#define __WCHAR_MAX__ 2147483647 
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) 
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 
#define __WCHAR_TYPE__ int 
#define __SIZEOF_WCHAR_T__ 4 

A resource предлагает:

«Оба C и C++ представил фиксированного размера типажи char16_t и char32_t в 2011 пересмотре своих соответствующих стандартов чтобы обеспечить однозначное представление 16-битных и 32-битных форматов преобразования Unicode, оставив wchar_t-реализацию ».

+0

проклятый .. Я, хотя wchar_t был 2 байта :(как я могу использовать независимые от платформы кодировки? – user2399415

+0

@ user2399415 отредактирован, чтобы предлагать вам разные типы: например, char1_t' или 'char32_t ' – sgun

+0

Большое спасибо! Сообщение jamesdlin очень полезно :-) – user2399415

1

Вот несколько очевидных проблем:

  1. Вы не распределяя пространство для NUL-терминатор.

  2. Вы считаете, что wchar_t - это 2 байта, что необязательно верно. Во многих системах Linux он может представлять собой кодовый блок UTF-32, длина которого составляет 4 байта.

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

  4. Вы звоните wprintf() на строке формата const char*, но wprintf() ожидает const wchar_t* аргумента. Компилятор должен был создать ошибку об этом. (Вы помните, чтобы добавить #include <wchar.h> (для C) или #include <cwchar> (для C++)?)

Предполагая, что это предназначается, чтобы работать только на ASCII входов, вы можете исправить эти проблемы, выполнив:

int size = strlen(data) + 1 /* NUL */; 
... 

// Allocate a wchar_t buffer directly. 
// Note that the cast below is necessary in C++ but not in C. 
wchar *temp = (wchar_t *)malloc(size * sizeof *temp); 
... 
int j = 0; 
for(int i = 0; i < size; i++) 
{ 
    temp[j++] = data[i]; 
} 

, а затем, когда вы звоните wprintf, используйте:

wprintf(L"%ls\n", temp); // Note the L prefix to the string literal. 

Кроме того, не забудьте позвонить free(temp), когда вы закончите.

+0

typo:' wchar * temp' -> 'wchar_t * temp' – dyp

+0

* Ahem *, я пытаюсь преобразовать однобайтовые символы в двухбайтовые (например, «a» становится «a \ x00», потому что некоторые ключевые слова, которые я использую, имеют длину два байта, это не только ASCII :) – user2399415

+1

@ user2399415: ваш исходный код попытался только буквы с нулевыми байтами, которые будут работать только для символов ASCII. Если вам нужно обрабатывать другие кодировки, вы будете: 1. Выяснить точно, с какими * кодировками, с которыми вы имеете дело, и 2. Записать декодер (или предпочтительно использовать существующую библиотеку). – jamesdlin

Смежные вопросы