--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

EUC環境のPHPでunicodeの文字をPDFに印字する

2011年07月13日 15:18

EUC環境のPHPで、unicodeの文字をPDFに印字する。


PHPで日本語を含むPDFを出力する方法として、「FPDF」「japanese.php」「fpdi.php」を使用する方法があります。
ただ、この「japanese.php」は、何もしない状態だと「SJIS」しか対応しない。
すると、SJISに含まれない文字を印字しようとすると、空白、化ける、そんなことになる。


全体の流れ


1.japanese.phpを改変し、unicodeを出力出来るようにする。
2.EUC内にも存在しない文字は、実体参照で渡す。
3.実体参照以外の文字コードを、eucjp-winからUTF-8へ変換
4.実体参照文字を復元し、実体参照をunicodeへ変換
5.実体参照文字をunicodeからUTF-8へ
6.実体参照文字の変換後を、元の位置へ復元
7.UTF-8からunicodeへ変換し、PDF出力



1.japanese.phpを改変し、unicodeを出力出来るようにする。


pdfoutput.php
//PDFライブラリ読み込み
require("japanese.php");

japanese.php
//
function AddUniJISFont($font='MS-Mincho',$family='UniJIS'){
//Add SJIS font with proportional Latin
$name=$font;
$cw=$GLOBALS['SJIS_widths'];
$CMap='UniJIS-UTF16-H';
$registry=array('ordering'=>'Japan1','supplement'=>2);
$this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
}


2.3.4.5.6.の文字列変換関数を作成

function convEUC2UTF8( $euc ){
// 数値参照の「&」がエスケープされて渡る場合があるため、復元
$euc = preg_replace( "/&/" , "&" , $euc );
// 数値参照を配列へ一時退避
$matches = array();
preg_match_all("/&#(\d+);/" , $euc , $matches );
// 数値参照を「!#!」で置き換え
$euc = preg_replace( "/&#(\d+);/" , "!#!" , $euc );
// 文字コードEUC→uicode
$utf8 = mb_convert_encoding( $euc , "UTF-8" , "eucjp-win" );
$ary = array();
$ary = preg_split( "/!#!/" , $utf8 );
$str = "";
// 文字列の復元
for( $i = 0 ; count( $ary ) > $i ; $i++ ){
$str.= $ary[$i];
$str.= $matches[0][$i];
}
$res =preg_replace_callback(
"/&#(\d+);/",
rep_func,
$str
);
return $res;
}

// unicodeからUTF-8へ(参考
function rep_func($matches){

$a = $matches[1]+0;
$b = chr(($a-($a%256))/256).chr($a%256);
$c = mb_convert_encoding( $b, "UTF-8", "unicode" );

return( $c );

}


7.UTF-8からunicodeへ変換し、PDF出力

pdfoutput.php
$this->pdf=new PDF_Japanese("P","pt","a4");
$this->pdf->AddUniJISFont();
$this->pdf->Open();
$this->pdf->AddPage();
$this->pdf->SetAutoPageBreak(false);
$this->pdf->SetMargins($left ,$top,$right);
$_val = convEUC2UTF8( $_val );
$_val = mb_convert_encoding( $_val , "unicode" , "utf-8" );
$this->pdf->SetFont("UniJIS",$opt1,$fontsize);
$this->pdf->SetXY( $x + $this->pdf->lMargin , $y + $this->pdf->tMargin );
$this->pdf->SetFontSize( $_fontsize );
$this->pdf->Cell( $w , $h, $_val,0,0,$align,0 );



以上

by よっしい

Windows7でSSHサーバー

2011年06月15日 10:58

windows端末へ、外部からリモートにて操作したい。
しかし、リモートデスクトップのポートを開放し直接接続するのは、セキュリティ上、気持ちが悪い。

ということで、SSHポートフォワードを使用し、セキュアなリモート接続を試みる。

手順

1.SSHサーバーを立てる
2.SSHサーバーの設定
3.ポート開放
4.リモート接続
5.ポートフォワード設定



1.SSHサーバーを立てる
windows7で、「OpenSSH for windows」をインストール後、サービス起動すると、エラーとなることが多発したため、アプリを変更。
  • freeSSHd」をインストール。
    OpenSSH windowsをインストールし、サービスを起動するとエラーが多発するため、freeSSHdをチョイス。
  • ダウンロードしたファイルを解凍し、ウィザードに従って進めてください。

2.SSHサーバーの設定
  • 前準備
    freeSSHdのインストール後、一度再起動し、サービスが起動している場合は、停止
    freesshd_11061500.png
    freesshd_11061501.png
  • SSH設定(ListenIP、ポート、公開鍵指定)
    freesshd_11061502.png
    Listen…自IP
    port…任意のポート。ルーター開放が必要。すでに開放されてあるポートと重複しないポートを指定
    RSAkey…後で再作成するが、わかりやすくするため、SSHログインユーザー名で、freeSSHdインストールフォルダへ作成
  • Authentication(認証設定)
    freesshd_11061503.png
    パスワードのみの認証を拒否するため、Password authenticationをDisabledへ変更
  • Tunneling(トンネルの許可)
    freesshd_11061504.png
    ポートフォワードを許可するため、下記のように設定を変更
    Allow local port forwardingのチェックをオン
    Allow remote port forwardingのチェックをオン
  • Users(ユーザー設定)
    SSHにてログインするユーザーを追加する。
    今回は、SSHの鍵認証で行うため、windowsに存在しないユーザー名でも可。もちろん、windowsに存在するユーザー名でも可。
    addボタンを押下し、追加ウィザードを開く。
    freesshd_11061505.png
    freesshd_11061506.png
    Login…SSHにてログインするユーザー名
    Authoritarian…Public key(SSH only)
    shell…シェルにログイン
    SFTP…SSH FTPにログイン
    Tunneling…トンネル許可
  • 鍵ペアの作成
    puttykegenを使用し、公開鍵・秘密鍵を作成。
    freesshd_11061507.png
    マウスをぐりぐり動かしてください。

    freesshd_11061508.png
    パスフレーズを指定すると、より強固なセキュリティーになります。
    OpenSSHのauthorizedkeyファイルにペーストするための公開鍵
    の文字列全体をコピーし、先ほど「SSH設定(ListenIP、ポート、公開鍵指定)」の項で作成した公開鍵ファイルへ上書き保存する。
    秘密鍵はクライアントからSSHサーバーへログインする際に使用します。わかりやすいように「SSHへログインするユーザー名.ppk」とします。

3.ポート開放
ルーターの設定から、SSHサーバー用に指定したポート番号を開放し、該当ポートへのアクセスはSSHサーバーへ転送するよう、設定する。
あわせて、SSHサーバー上でファイアウォールが存在している場合は開放する。

4.リモート接続
クライアント端末から、SSHサーバーへ接続テストを行う。
plink -P {ポート番号} -i {秘密鍵フルパス} {ユーザー名}@{ホストIP} ls

上記で、ホームディレクトリのファイル一覧が表示されれば成功。

5.ポートフォワード設定
pfwd_sample.ini
を編集し、ポートフォワードの設定を行う。



以上

Npgsql使用時、エラーとなる

2011年03月17日 10:20

Npgsqlを使用しVB.NETでデータをselectすると、エラーになる



Npgsqlを使用しVB.NETでデータをselectすると、エラーになることがあります。
はしごだか、たつさき等の、外字エリア文字をデータベースに登録してあると、起こります。

【環境】
PostgreSQL:EUC-JP
NpgSQL:UNICODE

ERROR: character 0xfce2 of encoding "EUC_JP" has no equivalent in "UTF8"
こんなエラーが表示されます。

これで、半日悩み、調べました。

【対応策】
下記サイトを参考にさせて頂きました。

http://grep.blog49.fc2.com/blog-entry-87.html


  • PostgreSQLには、内部に文字コード変換に使用するマッピングファイルがあります。
    /usr/local/src/postgresql-9.0.1/src/backend/utils/mb/Unicode/utf8_to_euc_jp.map
    /usr/local/src/postgresql-9.0.1/src/backend/utils/mb/Unicode/euc_jp_to_utf8.map
    ※ソースを削除しちゃった場合は、同バージョンのソースを再度ダウンロードして下さい。
    これらに、マッピングを追加していきます。
    {0xf9c8, 0xe58895},
    {0xf9c9, 0xe58a9c},


    ※コード順に挿入する必要有り。
  • cd /usr/local/src/postgresql-9.0.1/src/backend/utils/mb/conversion_procs
  • make clean && make && make install
  • 該当データベースにログイン
    DROP CONVERSION pg_catalog.euc_jp_to_utf8;
    CREATE DEFAULT CONVERSION pg_catalog.euc_jp_to_utf8 FOR 'EUC_JP' TO 'UTF8' FROM euc_jp_to_utf8;
    DROP CONVERSION pg_catalog.utf8_to_euc_jp;
    CREATE DEFAULT CONVERSION pg_catalog.utf8_to_euc_jp FOR 'UTF8' TO 'EUC_JP' FROM utf8_to_euc_jp;


以上

.NETから各種データベースへデータプロバイダを使用して接続するメモ

2011年03月08日 19:04

とりあえず、メモ

開発


※visual studio2008 framework3.5 にて検証

・Oracle
1.OTNからクライアント・データプロバイダー(Oracle Data Access Components for Windows)をダウンロード
  ※ユーザー登録が必要
2.インストール
3.開発中ソリューションの参照で、「Oracle.DataAccess」を参照
4.ソースで、「Imports System.Data.OracleClient」
 ※マイクロソフト社提供のデータプロバイダーを使用する場合には必要
5.ソリューションの「app.config」を追加し、以下を登録
<configuration>
<system.data>
<DbProviderFactories/>
<add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client2" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<DbProviderFactories>
<system.data>
<configuration>


・PostgreSQL
1.データプロバイダーダウンロード、解凍
2.解凍して出来た「Npgsql.dll」「Mono.Security」を共に参照し、ローカルへコピーを選択
3.ソースで「Imports Npgsql」
5.ソリューションの「app.config」を追加し、以下を登録
<configuration>
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.11.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
<DbProviderFactories>
<system.data>
<configuration>


・SQLServer
1.ソースで「Imports System.Data.SqlClient」


共通
Public Class comSql
Public DB_CON As DbConnection
Public DB_DR As DbDataReader
Public DB_TRN As DbTransaction
Dim _NG As String = "999"
Dim _EOF As String = "100"
Dim _OK As String = "000"
Public strErrMsg As String = "" ' エラーメッセージ
Dim provider As String = ""
Dim host As String = ""
Dim dbnm As String = ""
Dim port As String = ""
Dim user As String = ""
Dim pass As String = ""
' ------------------------------------------------------------
' データプロバイダーをインストールする必要有り。
' ------------------------------------------------------------

' コンストラクタ
Public Sub New( _
ByVal _provider As String, ByVal _host As String, ByVal _port As String, ByVal _dbNm As String, ByVal _user As String, ByVal _pass As String _
)
provider = _provider
host = _host
port = _port
dbnm = _dbNm
user = _user
pass = _pass
End Sub


' ------------------------------------------------------------
' 接続
' データプロバイダーにより、切り換え
' ------------------------------------------------------------
Public Function dbCon() As Short
Dim connectionClassNm As String = "" ' コネクションクラス名
Dim providerFilePath As String = "" ' データプロバイダーファイル名
Dim connectionStr As String = "" ' 接続文字列
Dim factory As DbProviderFactory
Dim DataProviderFilePath As String = ""
Select Case provider
Case "oracle"
connectionClassNm = "Oracle.DataAccess.Client2"
connectionStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" & host & ")(PORT=" & port & ")))(CONNECT_DATA=(SERVICE_NAME=" & dbnm & ")));User Id=" & user & ";Password=" & pass & ";"
'connectionStr = "Data source=" & host & ";User Id= " & user & ";Password=" & pass & ";"
Exit Select
Case "pgsql"
connectionClassNm = "Npgsql"
connectionStr = "Host=" & host & ";Port=" & port & ";Database=" & dbnm & ";User Id= " & user & ";Password=" & pass & ";"
Exit Select
Case "mssql"
connectionClassNm = "System.Data.SqlClient"
connectionStr = "server=" & host & "," & port & ";Initial Catalog=" & dbnm & ";User ID= " & user & ";Password=" & pass & ";"
End Select
factory = DbProviderFactories.GetFactory(connectionClassNm)
DB_CON = factory.CreateConnection()
DB_CON.ConnectionString = connectionStr
Try
DB_CON.Open()
Return _OK
Catch ex As Exception
strErrMsg = ex.ToString()
Return _NG
End Try
End Function
End Class



クライアント環境


・Oracle
1.上記でインストールした「データプロバイダー」「インスタントクライアント」をインストール
2.tnsnames.oraを編集(今回インストールしたインスタントクラインとのパス配下のファイルを編集)

PHPでの文字列処理

2011年02月18日 11:40

PHPでの文字列処理について、よく忘れるのでメモ。

長さを整える


全角文字やら半角もじやら、混在した文字列を、バイト数でもなく文字数でもなく、見た目の幅・長さで整える。
mb_strimwidth( $str , $start , $width , $addStr , $encode );
例)
$encode = "UTF-8";
$str = "test文字列です。aioeoアイウエオ";
$addStr = "..";
//長さを全角文字で5文字分
echo mb_strimwidth( $str , 0 , 10 , $addStr , $encode );

出力結果
test文字..

//長さを全角文字で10文字分
echo mb_strimwidth( $str , 0 , 20 , $addStr , $encode );

出力結果
test文字列です。ai..

メモ。
mb_strwidth( $str , "EUC-JP" );

での返り値で、「■」「□」「※」は「1」となる。なんでだろう…。
なので、マスキング等には「*」を使用する。「*」は「2」と期待通りの値を返す。