2009/05/18

PDFCreatorの日本語問題-PDF情報編2

やすさんのUPしてくださったソースと比較して、日本語(マルチバイトの文字列)が混ざると、PDFを[保存]できない原因がわかりました。

[保存]できない現象に対しての、修正箇所は

[Common]-[modCDlg.bas]-[SaveFileDialog]

もともとこのモジュールではOPENFILENAMEに対して下記のようにセットしていますが。

オリジナル

  1. 50160  With ofn  
  2. 50170   .nStructSize = Len(ofn)  
  3. 50180   .hWndOwner = hwnd  
  4. 50190   .sFilter = tFil  
  5. 50200   .nFilterIndex = FilterIndex  
  6. 50210   .sFile = InitFilename & Space$(1024) & vbNullChar & vbNullChar  
  7. 50220   .nMaxFile = Len(.sFile)  
  8. 50230   .sDefFileExt = DefaultFileExtension & vbNullChar & vbNullChar  
  9. 50240   .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar  
  10. 50250   .nMaxTitle = Len(ofn.sFileTitle)  
  11.   
  12. 50260   If InitDir = vbNullString Then  
  13. 50270     .sInitialDir = GetPDFCreatorApplicationPath & vbNullChar & vbNullChar  
  14. 50280    Else  
  15. 50290     .sInitialDir = InitDir & vbNullChar & vbNullChar  
  16. 50300   End If  
  17. 50310   .sDialogTitle = DialogTitle  
  18. 50320   .Flags = Flags  
  19. 50330  End With  

OPENFILENAME構造体は、


.nMaxFile   :ファイル名のバッファのサイズを設定

.nMaxFileTitle :フルパス用のバッファのサイズを設定


ですので、オリジナルのようにLenで計算している(行番号07.、10.)と、マルチバイトの文字列が入るとおかしくなっちゃうんですねー。

というわけで、下記のようにLenBにあらためます。

修正後

  1. 50160  With ofn  
  2. 50170   .nStructSize = Len(ofn)  
  3. 50180   .hWndOwner = hwnd  
  4. 50190   .sFilter = tFil  
  5. 50200   .nFilterIndex = FilterIndex  
  6. 50210   .sFile = InitFilename & Space$(1024) & vbNullChar & vbNullChar  
  7. '50220   .nMaxFile = Len(.sFile)  
  8. 50220   .nMaxFile = LenB(.sFile)    
  9. 50230   .sDefFileExt = DefaultFileExtension & vbNullChar & vbNullChar  
  10. 50240   .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar  
  11. '50250   .nMaxTitle = Len(ofn.sFileTitle)  
  12. 50250   .nMaxTitle = LenB(ofn.sFileTitle)  
  13.   
  14. 50260   If InitDir = vbNullString Then  
  15. 50270     .sInitialDir = GetPDFCreatorApplicationPath & vbNullChar & vbNullChar  
  16. 50280    Else  
  17. 50290     .sInitialDir = InitDir & vbNullChar & vbNullChar  
  18. 50300   End If  
  19. 50310   .sDialogTitle = DialogTitle  
  20. 50320   .Flags = Flags  
  21. 50330  End With  

この部分を修正すると無事、マルチバイトの文字列が入っていても、[保存]できるようになりますねぇ。

ちなみに[ReplaceEncodingChars]については、前回の16進変換の修正のみのモジュールのままでも、とりあえずのところは動きました(←そして8進変換の役割が、相変わらず、わかっていないじょにでした。[\XXX]の8進数を文字に置換しているのはわかっていても、「何故変換するのか。なにが入ってきて、どう変換すべきなのか」というそもそもの役割とかが見えきていないッス・泣)。

2 件のコメント:

やす さんのコメント...

こんばんわ。
すみません、まさか"modCDlg.bas"を修正していたとは・・・全く記憶にありませんでした。
なぜか今も思い出せません。

あと追加した8進変換ですが、例えばFirefoxでじょにさんのblogのコメント投稿のページを印刷(PDF化)すると、"Blogger: log book - \203R\203\201\203\223\203g\202\360\223\212\215e"といったデータが渡され、8進部分が文字化けしたので16進変換と同じ修正をしました。ただ、8進数で渡されるパターンが全くわかりません。

じょに さんのコメント...

こんばんわ。

あああ、確かに8進数もどきでも、タイトル類の日本語が入ってきますね。
「\203R\203\201\203\223\203g\202\360\223\212\215e」を日本語にすると「コメントの投稿」。
たとえば「\203R」の「\数値3桁」を16進数に変換、アルファベットをASCIIの16進数に変換すると「83 54」。これはS-JISでの「コ」…。以下略。

まるで暗号の解読みたいな気分になってきました。ヽ(´ー`)ノ