curvirgoです。
Yoshiyuki Masutomi wrote:
> convertIntoFullWidth_Impl()で前もって2byte文字に変換しておけばと思い、まずXPで1byte文字の時の振り仮名と2byte文字の時の振り仮名を確認してみた所、初めに1byte文字で入力したときは振り仮名も1byte文字で表示されるのに対し、続けて2byte文字を別のセルに入れると、先ほど表示されていた1byte文字の振り仮名も後から入力した2byte文字の振り仮名に併せて2byte文字で表示されてしまいました。
もう少し手直ししてみました。
自分の所のXPで気になる点は一つ、
2byteの「ABC」を入力すると、「ABC」ではなく「アbc」と表示されてしまう点です。
検証用のWindows98SE(クリーンインストール直後の状態)では期待どおりの結果が表示されるのでIME側(若しくは学習結果やバージョン間)の違いによるものと思われますが、ほぼいい感じにはなったと思います。
ただし、1byte→2byte変換してから振り仮名を取得するようにした為、現在のLinux版とは結果が異なるのでそちらもWindows版に近い結果になるように1byte→2byte変換してから振り仮名を取得する様に変更するか決めなければならないと思います。
--- furigana.orig/furigana_impl.cxx 2006-10-02 00:19:39.000000000 +0900
+++ furigana/furigana_impl.cxx 2006-10-03 23:07:20.656250000 +0900
@@ -38,12 +38,12 @@
#include <mecab.h>
#endif
#if defined(WIN) || defined(WNT)
-//#define _WIN32_WINNT
#include <windows.h>
#include <imm.h>
#endif
#include <string.h>
#include <stdio.h>
+#define TO_UNICODE(c1,c2)
(sal_Unicode)((c2>=0?c2:c2+0x100)*0x100+(c1>=0?c1:c1+0x100))
using namespace ::rtl;
using namespace ::com::sun::star;
@@ -170,12 +170,15 @@
}
delete tagger;
+
#endif
#if defined(WIN) || defined(WNT)
HIMC hIMC;
HKL hKL;
DWORD aConversionListSize;
LPCANDIDATELIST aConversionList;
+ OSVERSIONINFO aOSVersionInfo;
+ OUStringBuffer buf;
hIMC = ImmCreateContext();
hKL = GetKeyboardLayout(0);
@@ -186,16 +189,28 @@
{
if( aStrList[i][j].getLength() != 0 )
{
- OStringBuffer aStr =
OStringBuffer(OUStringToOString(aStrList[i][j], RTL_TEXTENCODING_SHIFT_JIS));
+ OStringBuffer aStr =
OStringBuffer(OUStringToOString(convertIntoFullWidth(aStrList[i][j]),
RTL_TEXTENCODING_MS_932));
aStr.append(static_cast< char >(0));
-
- aConversionListSize = ImmGetConversionList(hKL,
hIMC, aStr.getStr(), NULL, 0, GCL_REVERSECONVERSION);
- aConversionList =
(LPCANDIDATELIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
aConversionListSize);
- ImmGetConversionList(hKL, hIMC, aStr.getStr(),
aConversionList, aConversionListSize, GCL_REVERSECONVERSION);
-
- const char *result = (const char
*)aConversionList + aConversionList->dwOffset[0];
- res += OUString(result, strlen(result),
RTL_TEXTENCODING_SHIFT_JIS);
-
+ aOSVersionInfo.dwOSVersionInfoSize =
sizeof(aOSVersionInfo);
+ GetVersionEx(&aOSVersionInfo);
+ if(aOSVersionInfo.dwPlatformId < 2)
+ {
+ aConversionListSize =
ImmGetConversionListW(hKL, hIMC, (LPCWSTR)aStr.getStr(), NULL, 0,
GCL_REVERSECONVERSION);
+ aConversionList =
(LPCANDIDATELIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
aConversionListSize);
+ ImmGetConversionListW(hKL, hIMC,
(LPCWSTR)aStr.getStr(), aConversionList, aConversionListSize,
GCL_REVERSECONVERSION);
+ const char *result = (const char
*)aConversionList + aConversionList->dwOffset[0];
+ for(unsigned int
k=0;k<strlen(result);k+=2)
+
buf.append(TO_UNICODE(result[k],result[k+1]));
+ res += buf.makeStringAndClear();
+ }
+ else
+ {
+ aConversionListSize =
ImmGetConversionListA(hKL, hIMC, aStr.getStr(), NULL, 0, GCL_REVERSECONVERSION);
+ aConversionList =
(LPCANDIDATELIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
aConversionListSize);
+ ImmGetConversionListA(hKL, hIMC,
aStr.getStr(), aConversionList, aConversionListSize, GCL_REVERSECONVERSION);
+ const char *result = (const char
*)aConversionList + aConversionList->dwOffset[0];
+ res += OUString(result, strlen(result),
RTL_TEXTENCODING_MS_932);
+ }
HeapFree(GetProcessHeap(), 0, aConversionList);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]