Cách nhập và xuất tiếng Việt có dấu trong C++

ca này khó cho em hóng với :smiley:

console có được thì chắc khó :smile:

Bạn muốn nhập xuất qua màn hình hay qua file? Nếu qua file thì dùng thư viện Qt cho lẹ.

#include <iostream>
#include <io.h>
#include <fcntl.h>

int main()
{
    _setmode(_fileno(stdin), _O_U16TEXT);
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"Tiếng Việt có dấu" << std::endl;
    wchar_t test[256] = { 0 };
    std::wcout << L"Hãy nhập vào một chuỗi ký tự:" << std::endl;
    std::wcin >> test;
    std::wcout << L"Chuỗi ký tự mà bạn vừa mới nhập:" << std::endl;
    std::wcout << test; 
    return 0;
}
6 Likes

Bạn ơi, code trên chạy được rồi, nhưng khi xuất ra thì ký tự unicode sẽ thành dấu ‘?’ cả, thế nên mình phải chỉnh lại font Consolas. Có cách nào để dùng code thay đổi font đó khộng, khi chạy chương trình nó tự chỉnh font giúp mình luôn á. Với cả mình dùng Unikey để nhập tiếng Việt trong console không được.

Console trong Window thì hơi khó vì nó ếu hỗ trợ UTF -8 !

Mình dùng “Gõ Tiếng Việt” viết Tiếng Việt bình thường mà ta :slight_smile:

Bạn thử cái này xem (Lưu ý là bạn phải dùng wcin và wcout luôn chứ không dùng bình thường được nữa, và cái này dĩ nhiên là Windows-Only và máy phải có Consolas):

#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <string>
#include <windows.h>

int main()
{
    _setmode(_fileno(stdin), _O_U16TEXT);
    _setmode(_fileno(stdout), _O_U16TEXT);
    SetConsoleTitleW(L"Việt Nam Vô Địch!");
    HANDLE hdlConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_FONT_INFOEX consoleFont;
    consoleFont.cbSize = sizeof(consoleFont);
    GetCurrentConsoleFontEx(hdlConsole, FALSE, &consoleFont);
    memcpy(consoleFont.FaceName, L"Consolas", sizeof(consoleFont.FaceName));
    SetCurrentConsoleFontEx(hdlConsole, FALSE, &consoleFont);
    std::wcout << L"Tiếng Việt có dấu" << std::endl;
    std::wstring test;
    std::wcout << L"Hãy nhập vào một chuỗi ký tự:" << std::endl;
    std::getline(std::wcin, test);
    std::wcout << L"Chuỗi ký tự mà bạn vừa mới nhập:" << std::endl;
    std::wcout << test << std::endl;
    return 0;
}
2 Likes

Mình không biết sao code này lại không chỉnh font cho máy mình được :D. Nhưng thôi, quan trọng là mình biết cách nhập xuất tiếng Việt. Cảm ơn bạn nhiều nhiều nha

Console có hỗ trợ UTF8 nhé bạn.
Nếu mình nhớ không lầm thì là setconsoleoutputcp(65001) thì phải.

Bạn ơi đọc ghi file với unicode bằng cách nào v ?? bạn có nói dùng thư viện Qt mình không hiểu lắm, bạn chỉ rõ mình với
mình dùng c++ nha

1 Like

mình bị lỗi này là sao@@

Đưa code ngắn lên xem nào.

#include "stdafx.h"
#include<iostream>
#include<string>
#include<io.h>
#include<fcntl.h>
#include<Windows.h>

using namespace std;
class Students {
	int code;
	wstring fullname;
	wstring phonenumber;
	wstring birthday;
public:
	void getData();
	void setData();
};
void Students::setData() {
	wcout << L"Nhập mã sinh viên: ";
	cin >> code;
	wcout << L"Nhập tên sinh viên: ";
	getline(wcin >> ws, fullname);
	wcout << L"Nhập số điện thoại: ";
	getline(wcin>>ws, phonenumber);
	wcout << L"Nhập ngày sinh: ";
	getline(wcin >> ws, birthday);
}
void Students::getData() {
	wcout << L"Mã sinh viên: "<< code << endl;
	wcout << L"Họ tên: " << fullname << endl;
	wcout << L"Số điện thoại: " << phonenumber << endl;
	wcout << L"Ngày sinh: " << birthday << endl;
}

int main()
{	
	_setmode(_fileno(stdin), _O_U16TEXT);
	_setmode(_fileno(stdout), _O_U16TEXT);
	HANDLE hdlconsole = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_FONT_INFOEX consoleFont;
	consoleFont.cbSize = sizeof(consoleFont);
	GetCurrentConsoleFontEx(hdlconsole, FALSE, &consoleFont);
	memcpy(consoleFont.FaceName, L"Consolas", sizeof(consoleFont.FaceName));
	Students *sv = new Students;
	int n;
	wcout << L"Nhập số lượng sinh viên: "; cin >> n;
	for (int i = 0; i < n; i++) {
		wcout << L"Nhập thông tin sinh viên thứ " << i + 1 <<": "<< endl;
		sv->setData();
	}
	wcout << L"--------Danh sách sinh viên---------" << endl;
	for (int i = 0; i < n; i++) {
		sv->getData();
	}
	return 0;
}

Bạn đã chạy 2 lệnh này:

_setmode(_fileno(stdin), _O_U16TEXT);
_setmode(_fileno(stdout), _O_U16TEXT);

Thì cả chương trình, bắt buộc phải dùng wcoutwcin nhé

2 Likes

cảm ơn bạn mình sửa đc rồi. cho mình hỏi khi mình nhập gõ kiểu Telex nó ko đc @@

CMD Windows chỉ có GoTiengViet mới gõ được Tiếng Việt :laughing:

1 Like

wao, thank nhiều nhé, có gì không biết xin chỉ giáo thêm
lần đầu biết thêm cái lmgtfy này, hay quá
nó bị lỗi gì v bạn, mình mới #include thôi à

Qt cài vào Visual Studio khó lắm đấy, bạn lên mạng kiếm tut tích hợp vào VS 2015, hoặc xài luôn Qt Creator cho mau.

1 Like

à, ý là phải xài tool vào hả, vậy không được rồi, tại thầy mình bắt phải thao tác nhập xuất xử lý file với dữ liệu unicode, mà làm sao bắt ông thầy cài tool được
Bạn có cách nào khác không

Trên DNH có một bài: https://daynhauhoc.com/t/cach-d-c-va-ghi-file-unicode-c

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