Mình muốn hỏi các bạn là làm sao để viết được dòng : “Xin chào các bạn!”, viết bằng C ghi dòng chữ đó vào tập tin Output.txt và được lưu dưới dạng UTF-16. Mình không biết trong C có hỗ trợ thư viện hay hàm gì cho việc viết tiếng việt nữa??? Mong các bạn giúp đỡ ạ!!! Cảm ơn mọi người rất nhiều!!!
Hỏi về wchar_t trong c và gõ tiếng việt có dấu trong c
bạn thử _wfopen
xem: https://msdn.microsoft.com/en-us/library/yeby3zcb.aspx
lưu dưới dạng UTF-16 ko đơn giản… vì mỗi ký tự có 2 (có khi là 4) bytes nên phải biết thứ tự byte nào trước byte nào sau nữa, trên Windows thì là little endian (LE) nghĩa là byte có giá trị nhỏ đứng trước byte có giá trị lớn, ngược lại là big endian (BE). Để biết file utf-16 là LE hay BE thì lại đẻ ra cái trò chèn thêm byte-order-mark (BOM)…
ngoài ra 1 khi đã đọc / in wide character ra stdin/stdout thì ko sử dụng printf
, scanf
, gets
… được nữa mà tất cả phải xài phiên bản wide string tương ứng: wprintf
, wscanf
, getws
… FILE *
thì có lẽ vẫn đọc xen kẽ char
và wchar_t
với các file khác nhau được.
1 điểm lưu ý nữa là wide string/ wide char phải có thêm ký tự L
phía trước, ví dụ L'ắ'
là ký tự ắ
, L"Văn"
là chuỗi Văn
.
thử code này xem có chạy được ko
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <fcntl.h> //_O_U16TEXT
#include <io.h> //_setmode()
int main()
{
_setmode(_fileno(stdout), _O_U16TEXT); //cần để viết được ký tự utf-16 ra stdout
//_setmode(_fileno(stdin), _O_U16TEXT); //cần để đọc được ký tự utf-16 từ stdin
FILE * pFile = NULL;
wchar_t line[100];
// Tạo mới hoặc mở tập tin "danh sách sinh viên.txt"
// - để viết: w
// - định dạng: UTF-16LE
pFile = _wfopen(L"danh sách sinh viên.txt", L"w,ccs=UTF-16LE");
if (!pFile)
{
wprintf(L"ERROR: Cannot open file\n");
return EXIT_FAILURE;
}
// Ghi vào 1 dòng "Nguyễn Văn A"
fwprintf(pFile, L"%s\n", L"Nguyễn Văn A");
fclose(pFile);
// Mở lại tập tin "danh sách sinh viên.txt"
// - để đọc: r
// - định dạng: UTF-16LE
pFile = _wfopen(L"danh sách sinh viên.txt", L"r,ccs=UTF-16LE");
if (!pFile)
{
wprintf(L"ERROR: Cannot open file\n");
return EXIT_FAILURE;
}
// đọc dòng đầu tiên vào line
fgetws(line, 100, pFile);
fclose(pFile);
// in dòng đọc đươc ra màn hình
wprintf(L"%s\n", line);
return EXIT_SUCCESS;
}
à quên là nếu compile với MinGW thì phải lưu file trên dưới định dạng utf-8 nếu ko sẽ ko compile được.
cảm ơn b nhé. code của b chạy được rồi.