• Thứ Năm, 27/04/2006 14:21 (GMT+7)

    Visual C++ 2005 không hỗ trợ Unicode?

    Đáp ứng lại lòng mong mỏi của các lập trình viên C/C++, cuối cùng thì Visual C++ 2005 (phiên bản 8.0) cũng đã hỗ trợ Unicode một cách tự nhiên, kể cả trong trình thiết kế giao diện trực quan (Resource Editor) và trình soạn thảo mã (Source Editor). Visual C++ 2003 (7.1) chỉ hỗ trợ Unicode với trình soạn mã, Visual C++ 2002 (7.0) và 6.0 thậm chí còn không có khả năng viết mã dùng Unicode (dù rằng về mặt xử lí các chuỗi Unicode bên dưới thì từ phiên bản 6.0 trở đi đều rất tốt). Không còn những đoạn mã xử lí chuỗi dài dòng, không còn những kĩ thuật lập trình phức tạp, không còn phải đánh vật với những kí tự UTF-8 rối rắm. Chưa kể những cải tiến bên trong, chỉ riêng việc hỗ trợ đầy đủ Unicode cũng là một lí do khiến các lập trình viên phải nâng cấp rồi.

    Tuy nhiên, rất có thể bạn sẽ giống tôi, bị dội một gáo nước lạnh: khi thiết kế giao diện Unicode hiển thị rất tốt, nhưng đến lúc dịch ra file thực thi thì hầu hết những chữ có dấu đều đã chuyển thành dấu hỏi?


    Bạn đừng vội thất vọng. Nguyên nhân của vấn đề này là Visual C++ đã "vô tư” lưu file tài nguyên mà không mã hoá dưới dạng Unicode trước khi biên dịch, chính vì vậy các kí tự có mã >255 đều bị qui thành dấu hỏi. Việc khắc phục rất đơn giản.

    Thực ra, Visual C++ đã lưu file *.rc dưới dạng mã hoá riêng, nên khi bạn dùng Notepad để mở thì chỉ thấy dấu chấm hỏi, nhưng nếu dùng chính VC++ để mở thì vẫn hiển thị đúng. Trình biên dịch tài nguyên (Resource compiler) lại không hiểu được điều này, nó vẫn "máy móc" dịch với Character Set mặc định của tất cả các dự án và kết quả là những gì bạn đã thấy. Ta cần bắt VC++ lưu lại file tài nguyên dưới dạng mã hoá Unicode.

    Bạn dùng VC++ để mở file tài nguyên (vào File/Open hoặc bấm Ctrl+O, nếu bạn mở bằng cách nhấn đúp vào file thì sẽ không thể hiện cửa sổ thiết kế giao diện mà chỉ thấy dưới dạng thuần văn bản), sau đó mở một tài nguyên bất kì, vào menu File/Save File As/Save with Encoding, rồi chọn bảng mã Unicode.

    Đặc biệt, nếu bạn mở file tài nguyên bằng VC++ dưới dạng văn bản (theo cách nhấn đúp vào file tài nguyên), VC++ sẽ lưu lại nội dung y như thế dưới dạng Unicode, giữ nguyên các dấu chấm hỏi, giao diện của bạn sẽ hỏng thật sự, và bạn chỉ còn cách dùng Notepad để sửa thủ công mà thôi.

    Mở lại dự án, rồi cho biên dịch lại, thế là xong. Tiếng Việt Unicode đã được hiển thị một cách hoàn chỉnh:


    Tuy nhiên, cách làm trên khá mất công, có cách nào nhanh gọn hơn không? Tiếc là tôi mới chỉ biết cách bắt VC++ 2005 làm theo ý mình trong trường hợp sử dụng MFC. Rất đơn giản: khi tạo dự án mới, trong MFC Application Wizard, bạn hãy chỉnh sửa lại Main frame caption (đối với các ứng dụng SDI, MDI), hay Dialog Title (đối với ứng dụng Dialog-based) thành 1 chuỗi Unicode tiếng Việt bất kì:


    Khi đó, VC++ sẽ "biết ý” mà tự động ghi lại file tài nguyên dưới dạng Unicode cho bạn. Vì vậy, bạn sẽ không còn gặp trục trặc với vấn đề hiển thị tiếng Việt Unicode nữa.

    Nhưng bạn cần chú ý là đối với ComboBox, VC++ vẫn dùng cách mã hoá riêng, nên tiếng Việt Unicode sẽ không được ghi lại một cách chính xác, trong trường hợp này, bạn vẫn phải sử dụng mã nguồn để lưu dữ liệu.

    Hi vọng bài viết nhỏ này sẽ giúp ích cho các bạn trong việc sử dụng Unicode với Visual C++ 2005. Rất mong được các bạn góp ý, đặc biệt là việc "bắt" ComboBox phải hỗ trợ triệt để mã Unicode.

    Mai Văn Quân
    Email:
    Vimvq1987@gmail.com

     

    ID: A0604_137