30/09/2018, 20:36

Hỏi về wchar_t trong c! Gõ tiếng việt có dấu trong c

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!!!

viết 22:49 ngày 30/09/2018

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, getwsFILE * thì có lẽ vẫn đọc xen kẽ charwchar_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.

nguyen thanh tam viết 22:40 ngày 30/09/2018

cảm ơn b nhé. code của b chạy được rồi.

Bài liên quan
0