none
Как подключить русскую кодировку в Windows form RRS feed

  • Вопрос

  • После сохранения вводимой строки в массив, хочу ее снова вывести в строку, пишет иероглифы вместо русских букв. Облазил много сайтов и толком полезной информации не нашел, Windows form Visial Studio 2010. Пробовал через System::Text::Encoding::GetEncoding(1251)); не получилось. Помогите, пожалуйста, второй день мучаюсь.
    30 сентября 2017 г. 20:16

Ответы

  • У вас очень много проблем с этим кодом, от языка (C++/CLI который вообще не следует использовать для программирования) до самопального "шифрования" (тоже никогда не следует делать). 

    Но проблема "русских букв" заключена в том что вы теряйте половину данных "срезая" старший байт в 16 битных символах. Так что работает оно только для тех символов где этот байт нулевой. И он не нулевой для кириллицы. 

    В общем, замените все char (в первом массиве и везде где данные используются) на short (или int) и если ваш алгоритм "шифрования" работает для данных такого размера то русские буквы должны появится. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    1 октября 2017 г. 23:47
    Модератор

Все ответы

  • Покажите код "сохранения вводимой строки в массив" и восстановления обратно.

    Так же, зачем вы это делайте через какой то массив и в чем состоит задача в целом.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    30 сентября 2017 г. 21:57
    Модератор
  • private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { String^ str=textBox1->Text; String^ str1=textBox2->Text; String^ stro; char a[10000]; int sch=0; for each (char d in str){ a[sch]=d; sch++; } int b[10000]; int cur=0; for each (char s in str1){ b[cur]=Convert::ToInt32(s); cur++; } int h=0; for (int g=cur;g<10000;g++) {b[g]=b[h]; h++;} int d[10000]; for (int f=0;f<10000;f++) d[f]=a[f]^b[f]; for (int i=0;i<sch;i++) stro+=Convert::ToChar(d[i]); label1->Text=stro;}


    30 сентября 2017 г. 22:19
  • мне надо чтобы он понимал русский язык, я так понял надо менять кодировку на UTF-8?Но как это сделать? 

    Работает со всеми символами(в частности различные знаки, англ алфавит и т д), но не хочет работать с русскими буквами

    30 сентября 2017 г. 22:22
  • И что этот код должен делать? 


    This posting is provided "AS IS" with no warranties, and confers no rights.


    1 октября 2017 г. 2:56
    Модератор
  • Записывает вводимую информацию с textbox1 и textbox2 в массив и складывает по модулю каждый элемент массив. Записывает полученный результат в массив и выводит на экран информацию. Вся эта процедура проходит с английскими буквами и всеми другими символами, русский не получается
    1 октября 2017 г. 4:10
  • Не знаю в чем смысл всего этого, но это не работает. Для преобразования String в массив символов нужно использовать Marshal::StringToHGlobalAnsi или Marshal::StringToHGlobalUni, а не циклы
    1 октября 2017 г. 10:25
  • Все работает, но только на английском языке, мне надо чтобы компилятор понимал русский язык и затем хочу подключить кодировку UTF-8, а как это сделать я не знаю, пробовал множество методов смены кодировки, но не получается, может Вы подскажете как это сделать
    1 октября 2017 г. 13:57
  • "Все работает, но только на английском языке"

    Оно работает с английскими символами только из-за того, что их коды во всех кодировках одинаковы.

    "может Вы подскажете как это сделать"

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

    1 октября 2017 г. 15:23
  • Я делаю шифратор методом гаммирования, он записывает текст в массив и присваивает каждому символу цифру согласно его кодировке, вторым записывается гамма она тоже записывается в массив, после идёт сложение по модулю 2 каждого элемента массива гаммы с текстом, результат записывается в массив и выводится на экран, в итоге выходит шифртекст. Мой шифратор не видит русских символов в своей кодировке, я как знаю в кодировке UTF-8 имеются русские символы и за этим мне надо переделать кодировку, но не знаю как
    1 октября 2017 г. 15:32
  • UTF8 - мультибайтовая кодировка, она для таких вещей не очень. Сдается мне, вам нужен все-таки UTF-16 и тип wchar_t. Как-то так сделайте

    wchar_t* a=(wchar_t*)Marshal::StringToHGlobalUni(str);
    wchar_t* b=(wchar_t*)Marshal::StringToHGlobalUni(str2);
    wchar_t d[10000];
    
    //работаем с массивами a и b, записываем результат в d
    
    stro=gcnew String(d,0,wcslen(d));
    
    Marshal::FreeHGlobal((IntPtr)a);
    Marshal::FreeHGlobal((IntPtr)b);

    1 октября 2017 г. 16:04
  • Выдает ошибку, в лс возможно с Вами связаться? Поясню всю ситуацию там.
    1 октября 2017 г. 16:52
  • При вводе в textBox1 английских слов и символов шифровка текста и ее дешифровка получается, но при вводе русских слов, не получается дешифровка текста, вместо букв выдает буквы англ и цифры...Ниже приведу весь текст программы. Мне надо чтобы компилятор понимал русский язык
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    			 String^ str=textBox1->Text;
    String^ str1=textBox2->Text;
    String^ stro;
    
    char a[10000];
    int sch=0;
    for each (char d in str){
    	a[sch]=d;
    	sch++;
    }
    int b[10000];
    int cur=0;
    for each (char s in str1){
    	b[cur]=Convert::ToInt32(s);
    	cur++;
    }
    int h=0;
    for (int g=cur;g<10000;g++) {b[g]=b[h];
    h++;}
    
    int d[10000];
    		for (int f=0;f<10000;f++)
    			d[f]=a[f]^b[f];
    		
    for (int i=0;i<sch;i++) stro+=Convert::ToChar(d[i]);
    label1->Text=stro;
    		 }
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) { 
    			 String^ str0=textBox2->Text;
    			String^ str1=label1->Text;
    			String^ str2;
    			char chtext[10000];
    			int c=0;
    			for each(char d in str1){
    				chtext[c]=d;
    			c++;}
    			int gamma[10000],a=0;
    			for each(char d in str0){
    				gamma[a]=Convert::ToInt32(d);
    				a++;}
    			int p=0;
    			for (int n=a;n<10000;n++){
    			gamma[n]=gamma[p];
    			p++;}
    			
    			 int desh[10000];
    for (int m=0;m<10000;m++)
    	desh[m]=chtext[m]^gamma[m];
    for (int j=0;j<c;j++) str2+=Convert::ToChar(desh[j]);
    label2->Text=str2;
    		 }

    1 октября 2017 г. 19:45
  • У вас очень много проблем с этим кодом, от языка (C++/CLI который вообще не следует использовать для программирования) до самопального "шифрования" (тоже никогда не следует делать). 

    Но проблема "русских букв" заключена в том что вы теряйте половину данных "срезая" старший байт в 16 битных символах. Так что работает оно только для тех символов где этот байт нулевой. И он не нулевой для кириллицы. 

    В общем, замените все char (в первом массиве и везде где данные используются) на short (или int) и если ваш алгоритм "шифрования" работает для данных такого размера то русские буквы должны появится. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    1 октября 2017 г. 23:47
    Модератор
  • Спасибо большое, благодаря Вам понял в чем ошибка! 
    2 октября 2017 г. 16:57