Thắc mắc cách nhập ký tự Unicode qua bàn phím trong c++

Như bài bên trên, lần này mình cũng làm bài tập về viết chương trình nhập vào 2 câu thơ, phân cách bởi ký tự “/”. Nhưng lần này là nhập tiếng Việt. Mình có đọc qua một số topic về vấn đề này nhưng không tìm được kết quả nên viết lên đây nhờ các bạn giúp.
Câu hỏi của mình là:

  • Làm sao để nhập được tiếng Việt trong C++ qua bàn phím (mình lập trình trên dev-c++)
  • Nếu một ký tự đơn giản có mã ASCII là một số nguyên để phân biệt nhau (a=97, A=65, …) thì một ký tự unicode (vd: Á, á) có mã kiểu số nguyên không? Nếu có thì là gì?
  • Mình có thể đưa một ký tự unicode vào dấu nháy đơn để so sánh không? (vd: bien_mot == ‘Ô’)
Input:
2
Mưa sa rơi giọt giếng khơi/Còn mong chi nữa ai lời thủy chung
Rượu say men ái ân nồng/Người vui duyên mới pháo hoa tân hôn

Output:
TRUE
FALSE

Mình cảm ơn!

em chạy thử ví dụ này xem có ổn ko? Cách đọc và ghi file Unicode C++ nói là đọc ghi file nhưng cũng input output Unicode được. Nói sơ qua là khi i/o tiếng Việt trên Windows thì màn hình console phải xài font hiện chữ tiếng Việt được như Consolas, trong code thì phải xài wcin/wcout, std::string phải xài std::wstring (wide string), ký tự phải xài wchar_t thay cho char, ký tự/string literals thì phải thêm L vô đằng trước: L"abc", L’a’, nếu muốn xài tiếng Việt cho console args nữa thì phải xài wmain, v.v… Bên Linux thì ko có vụ khùng điên ba trợn này, xài cin/cout/string bình thường.

để gõ tiếng Việt trên console Windows thì mình xài… Gõ Tiếng Việt (của Trần Kỳ Nam) :V

3 Likes

Cách đơn giản nhất cho bạn là sử dụng các hệ điều hành nhóm Unix (Ubuntu, MacOS, v.v.), và nhập Tiếng Việt bình thường :smiley: , dữ liệu đầu vào sẽ là char* UTF8, và chữ Ô phải ghi là “Ô” chứ không dùng 1 kí tự, tức là do là UTF8 (encoding chuẩn của các hđh nhóm Unix) nên khi đọc chuỗi là phải đọc từ đầu, không random access, và 1 kí tự có thể là từ 1 byte đến 4 byte.

Còn nếu bạn dùng Windows thì rất khó, mà bản thân vấn đề về encoding lại cực kì phức tạp rồi. Cách thì có cách, nhưng mà cách trên như mình ghi là dễ nhất.

4 Likes

1 tới 4 byte thôi mà :V hay là nó mới tăng à?

1 Like

Sorry mình ghi nhầm thôi.

1 Like

Vụ Gõ Tiếng Việt đúng cái em cần anh ơi :smiley:
Nhưng mà em dùng wcout in ra màn hình 1 dòng tiếng Việt (VD: “Nhập chuỗi:”) , lúc compile thì lại thành “Nh?p chu?i”, mặc dù em dùng font consolas và đã active code page 65001. Em chưa hiểu vì sao.
Với cả em dùng getline(wcin, wstring_1); thì gõ được tiếng Việt không lỗi trên console, sau đó wcout << wstring_1; thì cũng bị lỗi font @@.

Hi Vũ Hoàng Long
Bạn cần trả lời 3 câu hỏi. Nhập, xuất, xử lý có hỗ trợ kiểu dữ liệu của bạn không (Tiêng Việt có dấu).
Nhập thì có hai cách chính: 1 Bạn lấy ký tự từ các bộ nhập có sãn. Kiểu như các phần mềm soạn thảo không hỗ trợ nhập tiếng Việt như khi bạn cài bộ gõ tiếng Việt vào thì có thể nhập được.
2. Bạn tự tạo một bộ gõ tiếng Việt hoặc nhúng một bộ gõ vào trong chương trình của mình.
Phần xuất. Nếu dùng consoler thì bạn cần cấu hình để hiển thị được tiếng Việt có dấu.
Phần xử lý thì C++ có hỗ trợ.
P/S: Cách đơn giản nhất là đọc từ file.

1 Like

Ko cần set code page gì hết, em chỉ cần setmode() cho input vá output là đc. Lưu file .cpp ở định dạng utf-8 no bom, chuỗi ký tự gì đều phải thêm L vô trước…

3 Likes

Cấu hình trong phần xuất là sao anh nhỉ? Em set font của console là consolas và active code page 65001 (theo một số TUT trên mạng) rồi, nhưng khi xuất thì vẫn bị “?” với “ụ” hoặc “à”, còn “á” thì vấn xuất được.

:V vào trong dev-c++ lưu file encoding là UTF-8, ko cần chcp gì hết

#include <iostream>
#include <fcntl.h> //_O_WTEXT
#include <io.h>    //_setmode()
#include <string>

int main()
{
    _setmode(_fileno(stdout), _O_WTEXT); //needed for output
    _setmode(_fileno(stdin), _O_WTEXT); //needed for input

    std::wcout << L"Nhập tên của bạn: ";
    std::wstring name;
    std::getline(std::wcin, name);
    std::wcout << L"Xin chào, " << name << L"\n";
}

edit: render lại cho đẹp :V
trong hình code page là 437 vẫn i/o tiếng Việt ngon lành
render1555505243097

2 Likes

Em code giống anh, lúc compile thì bị lỗi:
[Error] converting to execution character set: Illegal byte sequence
lỗi ở dòng:
std::wcout << L"Nhập tên của bạn: ";
và dòng:
std::wcout << L"Xin chào, " << name << L"\n";

em lưu file ở định dạng utf-8 chưa :V

nếu Dev-C++ ko lưu file utf-8 được thì em uninstall dùm anh luôn đi down notepad++ về rồi mở console lên gõ lệnh compile cho lành

compile bằng tay dễ lắm em tìm thư mục trình biên dịch có chứa g++.exe, rồi gõ full path tới g++ và thêm tên file main.cpp của em là nó compile file a.exe ra rồi :V
ví dụ
C:/mingw/bin/g++ main.cpp
là xong. Tội gì phải đi xài dev-c++ chả có intellisense gì hết :V

5 Likes


Hehe, cảm ơn anh, đúng là gỡ dev-c++ ra cho nhẹ đầu :smiley:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?