curvirgoです。
Takashi Nakamoto wrote:
> sal_Unicodeにキャストしなければいけないのを忘れてました。
>
> -#define TO_UNICODE(c1,c2) ((c2>=0?c2:c2+0x100)*0x100+(c1>=0?c1:c1+0x100))
> +#define TO_UNICODE(c1,c2)
> ((sal_Unicode)(c2>=0?c2:c2+0x100)*0x100+(c1>=0?c1:c1+0x100)))
>
> です。多分。
ちょっと違いました。
それでWindows95系列の動作に関してですが、とりあえず2byte文字の振り仮名の取得は出来ました。
ただし、1byte文字を含む文字列(文字列中の位置は関係なし)で1byte文字の2文字目以降が表示できません。
--- furigana.orig/furigana_impl.cxx 2006-10-02 00:19:39.000000000 +0900
+++ furigana/furigana_impl.cxx 2006-10-03 21:13:49.546875000 +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(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]