mfc — конвертировать двухбайтовые символы в целочисленное переполнение стека

Я строю проект MFC на C ++. У меня есть текстовое поле, в котором пользователь должен ввести число. Я могу преобразовать его в целое число, когда используется английская клавиатура. Но когда пользователь переключается на японскую клавиатуру, это не работает.

Я знаю, что японская клавиатура создает двухбайтовые символы. Но я не знаю, как преобразовать их в целое число.

Извините за недостаток информации.

Мое намерение состоит в том, чтобы проверить, является ли тип вводимых пользователей в текстовом поле числом или нет.
Но он не распознает номер с японской клавиатурой.
Я пробовал некоторые методы, такие как: strtol (), _wtoi.
Но результат (частота) всегда равен 0;
При отладке я получил строку 123 вместо 123456789.
Вот мой код

CString strFrequency;
GetDlgItem(IDC_EDIT_FREQUENCY)->GetWindowText(strFrequency);
if(strFrequency.IsEmpty()){
CDialog::OnOK();
return;
}

for(int i=1; i<strFrequency.GetLength(); i+=2) {
if(!std::isdigit(strFrequency[i])){
MessageBox("数字で入力してください。","発表支援");
return;

}
}
int frequency = atoi(strFrequency);

Все могут мне помочь?

заранее спасибо

0

Решение

CString strFrequency;
GetDlgItem(IDC_EDIT_FREQUENCY)->GetWindowText(strFrequency);

DWORD flags = LCMAP_HALFWIDTH;
const int size = strFrequency.GetLength() / 2 + 1;
char* s = new char[size];
ZeroMemory(s, size);
LCMapString(LOCALE_SYSTEM_DEFAULT,
flags,
strFrequency,
strFrequency.GetLength() + 1,
s,
size);
CString convertedText = s;

Я решил это. Строка (strFrequency) набирается японской клавиатурой полная ширина длина. Поэтому я преобразовал строку полной ширины в строку полуширины. Затем я могу проверить, является ли это числовой строкой или нет.

1

Другие решения

Без просмотра вашего кода, который пытается преобразовать число, и, по крайней мере, без подробного описания того, что на самом деле происходит, когда вы помещаете в него японский текст, будет довольно сложно сказать, что / почему не так. Пока что я могу думать только о том, что вы используете неправильный тип данных (то есть CHAR вместо WCHAR) или, возможно, вы пытаетесь анализировать японские символы, такие как ‘四万’, с помощью какого-то парсера только для арабского языка, такого как atoi () или, может быть, вы забыли правильно установить потоковую кодировку или локаль.

Пожалуйста, имейте в виду, что хотя японская клавиатура и японская локаль будут способны выдавать текст «40000», который, вероятно, будет разбираться с istringstream (и, возможно, даже будет с некоторой версией atoi), тогда почти наверняка японские цифры, такие как «四万» (это тоже 40000) скорее всего не будет анализироваться. Я думаю, что «四万» классифицируется как текст, а не цифры — но я могу быть очень неправ здесь! Я никогда не пробовал это. Но после небольшого поиска я не вижу никаких упоминаний о том, что это возможно.

Тем не менее, кажется, что есть некоторые способы для разбора цифр кандзи, см., Например, Как разобрать числовые символы кандзи с помощью ICU?

0

Если этот вызов компилируется и представляет японские символы,

MessageBox("数字で入力してください。","発表支援");

тогда кажется, что вы строите свой проект как ANSI, а не как UNICODE.

Попробуйте построить свой проект как UNICODE, изменив вызов на

MessageBox(L"数字で入力してください。",L"発表支援");
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector