ホームページ > バックエンド開発 > PHPチュートリアル > 異常なphpword中国語文字化け問題

異常なphpword中国語文字化け問題

WBOY
リリース: 2016-06-23 14:23:04
オリジナル
1237 人が閲覧しました

phpword ライブラリを使用して php で Word 文書を生成すると文字化けが発生します。これについてインターネットで多くの情報を検索しました。上記の手順に従って、
パブリック関数 setValue($search, $replace) を修正しました。 ) template.php 内) {
'}'
conv('gbk', 'utf-8', $replace);
}
中の utf8_encode を iconv('gbk','utf-8',$) に置き換えます。 replace);

テキストもトランスコードされ、データベースから読み取られたデータもトランスコードされて書き込まれます。 Word 文書はトランスコードされたままですが、ワードを生成すると、トランスコード時に中国語の文字が文字化けしてしまいました。 gbkからutf-8へ。
2 つのコツを教えてください、ありがとう。



ディスカッションへの返信 (解決策)

親愛なる兄弟たち、私を助けてください。多くの方法を試しましたが、うまくいきません。 。 。 。


データベースのエンコード形式?ページエンコード形式?各

データベースのエンコード形式は何ですか?ページエンコード形式?それぞれは何ですか?

それらはすべて utf-8 です

3 階の ohmygirl からの返信を引用します:

データベースのエンコード形式?ページエンコード形式?それぞれは何ですか

それらはすべて utf-8 です

Word のデフォルトのエンコード形式は gbk である必要があります。Word 文書を作成するときに gbk エンコードを使用してみてください (Word 文書のコンテンツは gbk を使用しており、ページは引き続き使用できます)。あなたの utf -8)

Word のデフォルトのエンコード形式は gbk である必要があります。Word 文書を作成するときに gbk エンコードを使用してみてください (Word 文書のコンテンツに gbk を使用すると、ページでは引き続き utf-8 を使用できます)
私もこれを試しました。utf-8をgbkに変換した後、Wordを書き込むときは空ですが、データはあります。

次に、Word ドキュメントを書いたコードを投稿して見てください~~

次に、Word ドキュメントを書いたコードを投稿して見てください~~

if(in_array('7', $a, TRUE) ){
$ table->addCell(1000, $styleCell)->addText('サイト コード', $fontStyle);

$table->addCell(1000, $styleCell)->addText(iconv(' utf-8' ,'gbk','駅名'), $fontStyle);

$table->addCell(1000, $styleCell)->addText('河川システム', $fontStyle); >addCell( 2500, $styleCell)->addText('時間を報告しに来てください', $fontStyle);

$table->addCell(1000, $styleCell)->addText('水位', $ fontStyle);

$table->addCell(1000, $styleCell)->addText('水の可能性', $fontStyle);
$conn = mssql_connect($config['mssql']['host'],$ config['mssql'][ 'user'],$config['mssql']['password']);
mssql_select_db($config['mssql']['dbname'],$conn); = "exec HNow05_getZZSpace '', '".$tm."','',1"
//$sql=mb_convert_encoding($sql,'UTF-8','GBK'); $sql);

while ($arr = mssql_fetch_array($res)){
$table->addRow();
$table->addCell(1000)->addText(iconv('gbk',') utf-8',$arr ["STCD"]));
$table->addCell(1000)->addText(iconv('utf-8','gbk',$arr["STNM"]) );
$table->addCell(1000)->addText($arr["RVNM"]);
$table->addCell(2500)->addText(iconv('gbk','utf- 8',$arr[" TM"]));
$table->addCell(1000)->addText(iconv('gbk','utf-8',$arr["Z"]));
//$table->addCell(1000)->addText(iconv('gbk','utf-8',$arr["WPTN"]));
if($arr["WPTN"] = = 6){
$table ->addCell(1000)->addText(iconv('utf-8','gbk',' flat'));
}else if($arr["WPTN"] = = 5){
$table ->addCell(1000)->addText(iconv('gbk','utf-8','rise'));
}else if($arr["WPTN"] = = 4){
$table ->addCell(1000)->addText(iconv('gbk','utf-8','drop'));
}
}
}

上記のさまざまなトランスコーディング方法をすべて試しましたが、うまくいきません

テンプレートで gbk を utf-8 に変換しました

Text を追加するときに setValue メソッドが呼び出されますか?

よくわかりません! ! !

テンプレートで gbk を utf-8 に変換しました

addText 時に setValue メソッドが呼び出されますか?
setValue() メソッドは呼び出されません

コードが文字化けする原因は、データ型の変換に他なりません

文字列 - 配列 gbk を使用する場合は、文字列を配列に変換する必要があります

//コード化けの原因は gbk が変換する際にデータ型変換:character-array を行うため、文字化けが発生します
foreach($orders as $key1 => $order)
{
$orders[$key1]['order_goods' ] = '';
if($orders[$key1]['add_time'])
{$orders[$key1]['add_time'] = date('Y-m-d H:i:s', $orders[$key1] ]['add_time' ]);}
if($orders[$key1]['pay_time'])
{$orders[$key1]['pay_time'] = date('Y-m-d H:i:s', $ order[$key1] ['pay_time']);}
if($orders[$key1]['ship_time'])
{$orders[$key1]['ship_time'] = date('Y-m-d H:i: s', $orders [$key1]['ship_time']);}
if($orders[$key1]['finished_time'])
{$orders[$key1]['finished_time'] = date('Y-m-d H:i:s ', $orders[$key1]['finished_time']);}
if($orders[$key1]['evaluation_time'])
{$orders[$key1]['evaluation_time'] = date('Y-m-d H : I: s', $ Orders [$ Key1] ['Evaluation_time']);}}}



データベースのフィールドは文字列ですが、データがエクスポートされる場合は、データ型変換する必要があります。
utf-8の場合は必要ありません。

そうです。プログラム ファイルを gb2312 形式で保存し、データベースからデータを読み取るという別の方法もあります
iconv('utf-8','gb2312',$text); 次に、次のように追加します。それを Word 文書にコピーします。

または、文字化けの原因が ob バッファにある場合もあります。Word 文書を書き込む前に ob_clean() を追加してみてください。 。

PHPWordのライブラリはPHPExcelのライブラリとほぼ同じだと思います。

エンコードは可能な限り UTF-8 に統一してください

コード化けの原因はデータ型の変換に他なりません

文字列 - 配列 gbk を使用する場合は文字列を配列に変換する必要があります

// コード化けの原因 gbk が文字配列変換する際のデータ型変換なので文字化けが発生します
foreach($orders as $key1 => $order)
{
$orders[$key1][ 'order_goods'] = '' ;
if($orders[$...
データベースも含めてすべて utf-8 であり、データベースを設計する際にも utf-8 が使用されます

PHPWord ライブラリはPHPExcel ライブラリとほぼ同じです

それらは同じです、先週 phpexcel を使用してすべてのエンコーディングを utf-8 に変換し、それから今度はすべてのエンコーディングを uft-8 に変換しました。 Excelと同じ方法ですが、文字化けします

さて、プログラムファイルをgb2312形式で保存し、データベースからデータを読み取るという方法もあります

iconv('utf-8','gb2312') ,$text);
次に、それを Word ドキュメントに追加します

または、文字化けの原因は、Word ドキュメントを書き込む前に ob_clean() を追加してみてください。形式を変更しましたが、それでも機能しませんでした。また、utf-8 から gbk に変換すると、空になりました。ob_clean() も試しましたが、機能しませんでした。

PHPword をダウンロードしてテストしました (テンプレートを使用して Word ファイルを生成しました)。

私の形式は次のとおりです: ファイルを ANSI 形式で保存します

次に、template.php ファイルを変更します。
utf8_encode 行を $replace=iconv('gbk','utf-8',$replace); に変更します。文字化けせずに中国語を出力します。

データベースは utf-8 形式でエンコードされています。次のようになります:
1. プログラムも utf-8 形式である場合は、トランスコーディングが行われないように $replace=iconv('gbk','utf-8',$replace); をコメントアウトすることをお勧めします。必須。

2.プログラムが gbk でエンコードされている場合は、データベースからプログラムを取得するときに、最初に iconv('utf-8', 'gbk', $value); および template を実行する必要があります。 php に $replace=iconv('gbk','utf-8',$replace); を追加する必要があります。

試してみてください。幸運を祈ります

ページ表示エンコーディング ステートメントを関数に関連するすべてのページに追加し、ツールを使用してこのエンコーディングに変更します。ただし、エンコーディングを変換した後にコード表示を見ると、漢字が文字化けしていないことがわかります。 ? ? ? ? ?をクリックし、ページを削除して再度コピーします。 notepad++ または editplus を使用できます

データベースのエンコードも変更されており、文字化けしているかどうかを確認できます。接続する前に、データベースの読み取りエンコード方式を設定する必要があります。
。 。 。 。 。 。 。
これを行うと、一般的にはコードは文字化けしません。それでも文字化けが発生する場合は、修正していないページがまだあるか、失敗していることを意味するだけです。
心配しないでください、私も長い間このことに悩まされてきました。

ページ表示エンコーディング ステートメントを関数に関連するすべてのページに追加し、ツールを使用してこのエンコーディングに変更します。ただし、エンコーディングを変換した後にコード表示を見ると、漢字が文字化けしていないことがわかります。 ? ? ? ? ?をクリックし、ページを削除して再度コピーします。 notepad++ または editplus を使用できます

データベースのエンコードも変更されており、文字化けしているかどうかを確認できます。接続する前に、データベースの読み取りエンコード方式を設定する必要があります。
。 。 。 。 。 。 。
これをやると、一般的にはそうではありません...
はは、あなたの方法に注目して、トランスコードできるほとんどすべての場所をutf-8に変換しました。

PHPword をダウンロードしてテストしました (テンプレートを使用して Word ファイルを生成します)。


私の形式は次のとおりです: ファイルを ANSI 形式で保存します

次に、template.php ファイルを変更します。
utf8_encode 行を $replace=iconv('gbk','utf-8',$replace); に変更します。文字化けせずに中国語を出力します。

データベースは utf-8 形式でエンコードされています。次のようになります:
1. あなたのプログラムも ut である場合...
ああ、やはり失敗しました。究極のトリックを使用する必要があるようです...

このモジュールを覆して書き直してください。あなたの方法に従って少しずつやり直してみます。おそらく途中で問題が残ります。ありがとうございます。

ありがとうございます

ある方法を試してみました。

Section.php の addText 関数を見つけて、

$givenText = utf8_encode($text);
ログイン後にコピー


$givenText = iconv('gbk', 'utf-8', $text);
ログイン後にコピー

に変更してから、section->addText (iconv('utf-8', 'gbk', 'your string')) とします。これは、次の変換と同等です。最初に gbk に変換し、次に utf-8 に変換します
注: PHP ファイルはすでに utf-8 でエンコードされているため、変換方法がわかりません

上記の投稿者のおかげで、投稿者と私は同じ問題に遭遇しました。
上記の提案に触発されて、いくつかの変更を加えたところ、うまくいきました。
大まかな概要:
1.phpword には、template.php ファイルというテンプレート関数があります
元の投稿者によると、
public function setValue($search, $replace) {
if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
$search = replace)) {
// $replace = utf8_encode($replace);
$replace conv( を置き換えます) 'gbk' ,'utf-8',$replace);
テンプレートを使って変数を中国語に置き換えると文字化け問題が解決できます

2. phpwordにはテーブル関数があります
テーブル追加時に中国語を入力するには値:
$ table->addCell(1000, $styleCell)->addText('サイト コード', $fontStyle);
ファイルを変更する必要があります: PHPWordSectionTableCell.php の addText() メソッド
public function addText( $text, $ styleFont = null, $styleParagraph = null) {
//$text = utf8_encode($text)
$text = new PHPWord_Section_Text($text, $styleFont, $styleParagraph);
$this->_elementCollection; [] = $ text;
return $text;
}
この行をコメントアウトしてください $text = utf8_encode($text);
中国語のテキストを直接追加する必要がある場合は、上記の手順に従ってください。

まとめると、phpwordは基本的にコンテンツの追加やコンテンツの置換時に入力文字列に対してutf8_encode処理を実行します。
入力エンコーディングが ISO-8859-1 文字セットの場合は、変更を加える必要はありません。他の文字セットの場合は、このステートメントを iconv 関数に置き換えて、文字セットを utf8 に変更する必要があります。理論的には、入力時に文字セットを ISO-8859-1 に直接変更できるため、バックグラウンドで phpword コードを操作する必要はありません。

上記のポスターのおかげで、上記のポスターと同じ問題が発生しました。
上記の提案に触発されて、いくつかの変更を加えたところ、うまくいきました。
大まかな概要:
1.phpword には、template.php ファイルというテンプレート関数があります
元の投稿者によると、
public function setValue($search, $replace) {
if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
$search = replace)) {
// $replace = utf8_encode($replace);
$replace conv( を置き換えます) 'gbk' ,'utf-8',$replace);
テンプレートを使って変数を中国語に置き換えると文字化け問題が解決できます

2. phpwordにはテーブル関数があります
テーブル追加時に中国語を入力するには値:
$ table->addCell(1000, $styleCell)->addText('サイト コード', $fontStyle);
ファイルを変更する必要があります: PHPWordSectionTableCell.php の addText() メソッド
public function addText( $text, $ styleFont = null, $styleParagraph = null) {
//$text = utf8_encode($text)
$text = new PHPWord_Section_Text($text, $styleFont, $styleParagraph);
$this->_elementCollection; [] = $ text;
return $text;
}
この行をコメントアウトしてください $text = utf8_encode($text);
中国語のテキストを直接追加する必要がある場合は、上記の手順に従ってください。

まとめると、phpwordは基本的にコンテンツの追加やコンテンツの置換時に入力文字列に対してutf8_encode処理を実行します。
入力エンコーディングが ISO-8859-1 文字セットの場合は、変更を加える必要はありません。他の文字セットの場合は、このステートメントを iconv 関数に置き換えて、文字セットを utf8 に変更する必要があります。理論的には、入力時に文字セットを ISO-8859-1 に直接変更できるため、バックグラウンドで phpword コードを操作する必要はありません。 教訓を教えてもらいました。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート