0


我正在尝试使用 C 中的 fwscanf() 读取 Shift-JIS 编码的文本文件,如下所示:

_locale_t JapaneseLocale=_create_locale(LC_ALL, "ja_JP");
FILE *inoto,*outoto;
double oto[LineCount][5];
int CurrentReading=0
wchar_t Filename[LineCount][MAX_PATH];
wchar_t Alias[LineCount][MAX_PATH];
setlocale(LC_ALL,"ja_JP");
inoto=_wfopen(L"oto.ini",L"r");
while(fwscanf(inoto,L"%S.wav=%[^L','],%lf,%lf,%lf,%lf,%lf%*C",&Filename[CurrentReading][0],&Alias[CurrentReading][0],&oto[CurrentReading][0],&oto[CurrentReading][1],&oto[CurrentReading][2],&oto[CurrentReading][3],&oto[CurrentReading][4])==7) 
++CurrentReading;
fclose(inoto);

文件中每一行的格式如下:
_あ_い_う_え_お.wav=-あB2,568.613,375.0,-583.333,250.0,83.333
生成的数组长度正确,没有出错在编译或运行时,但操作后数组仍然为空。
但是,我已经能够使用此代码块来正确确定文件中的行数:

wchar_t tempchar;
int LineCount=0;
while(tempchar!=WEOF)
{
tempchar=fgetwc(inoto);
if(tempchar==L'\n') ++LineCount;
}

我也不确定 %[^L','] 是否可以用宽字符正确处理。我的编译器是 Windows 10 上的 Mingw-w64。
提前致谢!

编辑:感谢 Jonathan Leffler 和 phuclv 的更正和建议!我深入研究了这个问题,发现我能够做到这一点而不会弄乱SetConsoleOutputCPwindows.h 中使用的宽字符以及 ASCII 输入/输出的相同功能而不会出错。一件重要的事情是,对于 Windows 上的 Shift-JIS,正确的语言环境是“Japanese_Japan.932”。但是,知道这个功能是 Windows 特定的,我想知道如何在其他平台(如 Linux)上实现相同的功能,只使用 C 标准功能。无论全局区域设置如何,printf 系列函数似乎都将输出字符串视为 UTF-8。

4

0 回答 0