[問題] 日文 多國語言

看板C_and_CPP作者 (~飛~)時間15年前 (2011/02/16 22:54), 編輯推噓6(6057)
留言63則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) ANSI C++ 問題(Question): 最基本的coding大部分都是在 command line 下 ( dos 預設的輸出 ) 因為大部分都是顯示 英文 突然想到 如果想印出 日文或別國的語言的話, 是不是有特殊的指令,還是用C++的寬字元型別 就可以印了 ? 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.136.114

02/16 23:17, , 1F
用Unicode
02/16 23:17, 1F

02/17 01:34, , 2F
用 DOS prompt 的話可不是 Unicode 就能搞定的, 科科
02/17 01:34, 2F

02/17 15:27, , 3F
首先,最好是使用 Unicode
02/17 15:27, 3F

02/17 15:33, , 4F
再者,請參考 http://0rz.tw/jfMYV(MSDN - Locale)
02/17 15:33, 4F

02/17 15:36, , 5F
以下字串支援顯示日文:setlocale( LC_ALL, "japan" );
02/17 15:36, 5F

02/17 15:39, , 6F
http://0rz.tw/NHAC8(國家區域,Country/Region String)
02/17 15:39, 6F

02/17 15:45, , 7F
如有需要,請詳閱相關資料以確認這個函式是否跨Linux。
02/17 15:45, 7F

02/17 16:17, , 8F
在此新增一個範例:https://gist.github.com/831288
02/17 16:17, 8F

02/17 16:18, , 9F
顯示日文,恐怕得先將系統變更為日文環境,…
02/17 16:18, 9F

02/17 16:19, , 10F
例如「控制台/地區及語言選項」
02/17 16:19, 10F

02/17 19:52, , 11F
受教了,感謝!
02/17 19:52, 11F

02/17 22:30, , 12F
如果是指M$的cmd 要先改active codepage才能顯示
02/17 22:30, 12F

03/29 03:45, , 13F
改codepage還是先得讓OS灌好日文語系
03/29 03:45, 13F

09/14 02:18, , 14F
#include "stdafx.h"
09/14 02:18, 14F

09/14 02:19, , 15F
#include <iostream>
09/14 02:19, 15F

09/14 02:19, , 16F
#include <io.h>
09/14 02:19, 16F

09/14 02:19, , 17F
#include <fcntl.h>
09/14 02:19, 17F

09/14 02:20, , 18F
int wmain(int argc, wchar_t* argv[]){
09/14 02:20, 18F

09/14 02:20, , 19F
_setmode(_fileno(stdout), _O_U16TEXT);
09/14 02:20, 19F

09/14 02:25, , 20F
std::wcout << L"ληñÜΨЖばぞ "<< std::endl;
09/14 02:25, 20F

09/14 02:26, , 21F
getchar();//暫停
09/14 02:26, 21F

09/14 02:26, , 22F
return 0;
09/14 02:26, 22F

09/14 02:26, , 23F
}
09/14 02:26, 23F

09/14 02:28, , 24F
中、日、英、法、德、西、義、丹麥、芬蘭、俄 可以印出
09/14 02:28, 24F

09/14 02:31, , 25F
韓、泰、匈牙利、波蘭、阿拉伯、印度、希伯來 印不出來
09/14 02:31, 25F

09/14 02:31, , 26F
希臘文 可以
09/14 02:31, 26F

09/14 02:34, , 27F
我用Visual Studio跑這隻code,都沒有另外改環境XD
09/14 02:34, 27F

09/14 02:37, , 28F
簡單好用!!!
09/14 02:37, 28F

09/14 02:38, , 29F
code輸出:ληñÜΨЖばぞ
09/14 02:38, 29F

09/14 02:40, , 30F
字母的語系分別是:希希西德希俄日日
09/14 02:40, 30F

09/14 02:42, , 31F
也不需要另外灌語系
09/14 02:42, 31F

09/22 23:01, , 32F
如果想讀取Unicode的txt...
09/22 23:01, 32F

09/22 23:01, , 33F
#include "stdafx.h"
09/22 23:01, 33F

09/22 23:01, , 34F
#include <sstream>
09/22 23:01, 34F

09/22 23:02, , 35F
#include <fstream>
09/22 23:02, 35F

09/22 23:02, , 36F
#include <iostream>
09/22 23:02, 36F

09/22 23:02, , 37F
#include <io.h>
09/22 23:02, 37F

09/22 23:02, , 38F
#include <fcntl.h>
09/22 23:02, 38F

09/22 23:03, , 39F
#include <windows.h>
09/22 23:03, 39F

09/22 23:04, , 40F
int wmain(int argc, wchar_t* argv[]){
09/22 23:04, 40F

09/22 23:04, , 41F
FILE* fp;
09/22 23:04, 41F

09/22 23:05, , 42F
_wfopen_s(&fp, L"123.txt", L"r");
09/22 23:05, 42F

09/22 23:06, , 43F
_setmode(_fileno(fp), _O_U16TEXT);
09/22 23:06, 43F

09/22 23:06, , 44F
std::wifstream fs(fp);
09/22 23:06, 44F

09/22 23:06, , 45F
std::wstring aa;
09/22 23:06, 45F

09/22 23:07, , 46F
while (fs>>aa){
09/22 23:07, 46F

09/22 23:07, , 47F
std::wcout << aa << std::endl;
09/22 23:07, 47F

09/22 23:08, , 48F
}
09/22 23:08, 48F

09/22 23:08, , 49F
fclose(fp);
09/22 23:08, 49F

09/22 23:08, , 50F
getchar();//暫停
09/22 23:08, 50F

09/22 23:09, , 51F
return 0;
09/22 23:09, 51F

09/22 23:09, , 52F
}
09/22 23:09, 52F

09/22 23:10, , 53F
這是一個詞一個詞讀進來(以空格切割一行中的每個詞)
09/22 23:10, 53F

09/22 23:13, , 54F
如果std::wstring aa; 改用 wchar_t array[70];
09/22 23:13, 54F

09/22 23:14, , 55F
while (fs>>aa){ 改用 while(fs.getline(array, 70)){
09/22 23:14, 55F

09/22 23:14, , 56F
std::wcout << aa << std::endl; 改用
09/22 23:14, 56F

09/22 23:15, , 57F
std::wcout << array << std::endl;
09/22 23:15, 57F

09/22 23:16, , 58F
就會一行一行讀進來,70表示你設定一行可讀70個字母
09/22 23:16, 58F

09/22 23:26, , 59F
如果std::wstring aa; 改用 wchar_t aa;
09/22 23:26, 59F

09/22 23:27, , 60F
一樣 while (fs>>aa){
09/22 23:27, 60F

09/22 23:27, , 61F
一樣 std::wcout << aa << std::endl;
09/22 23:27, 61F

09/22 23:28, , 62F
就會一個字母一個字母讀進來
09/22 23:28, 62F

09/22 23:30, , 63F
以上兩隻都是在Visual Studio Ultimate 2013執行
09/22 23:30, 63F
文章代碼(AID): #1DM-Kc61 (C_and_CPP)