moji encode開発メモ【コードも公開】

おすすめ記事ピックアップ

特殊文字を変換するツールを作ってみようと思い実際に作ってみました。良くある変換ツールは、HTML特殊文字のみを変換するものです。それではつまらないので、自由に指定した文字を変換できるツールを作ってみようと思いました。

初心者の開発メモです。盛大な勘違いがたぶんあります。コードも汚いでしょう。詳しい方いましたら、こうした方が良いぜ!というコメントいただけると嬉しいです。最下部にコードも公開しました。
制作したmoji encode
http://furimuke.sub.jp/changemoji/

文字の置換について

まず文字の置換方法から考えました。PHPで文字の置換を調べると、「str_replace」や「preg_replace」が出てきます。はじめこれで文字を置換したのですが、どうも結果がおかしいのです。複数置換する文字があると、一つ一つ置換処理されるため、置換されたものが再置換されます。

これは困ったと調べましたら「strtr」で解決しました。連想配列が苦手だったので敬遠したのが良くなかったです。
strtrで重複置換の問題を解決
http://www.furimuke.com/2013/11/php-strtr-strreplace-pregreplace-1.html

文字のエンコードについて

次に文字をエンコードする方法を考えました。エンコードとは、文字を文字参照に変換する方法です。エンティティとか文字参照とか実体参照とか、似たような意味で混乱したので、まず名称を整理しました。実体参照が使われることが多いのですが、10進数の文字参照を使うことにしました。

エンコード方法を調べてみると「htmlspecialchars」、「mb_convert_encoding」、「mb_encode_numericentity」が出てきました。「htmlspecialchars」はHTML特殊文字のみ、「mb_convert_encoding」は日本語のみしか変換できません。なんでも変換する「mb_encode_numericentity」を使うことにしました。
PHPの文字参照化、エンティティ処理、各方法の違い
http://www.furimuke.com/2013/11/htmlspecialchars-mbconvertencoding-mbencodenumericentity.html

変換する文字について

はじめにチェックボックスで、変換したい文字を指定する方法を考えていました。HTML特殊文字だけども、相当な種類があります。代表的なモノだけとも思ったのですが、なんだかイマイチです。テキストで自由に指定できるようにしようと考えました。

入力してテキストボックスの文字を、ひとつひとつ小間切れにして、取り出せば良いと考えました。「preg_split」で、テキストを分解できました。しかしマルチバイト文字を入力すると、一文字一文字取りだすことができません。「function mb_str_split」で解決しました。
mb_split
http://php.net/manual/ja/function.mb-split.php


配列数に応じて配列を作る方法について

プログラム全体の設計図が大体できました。まず変換(置換)させたい文字を入力して、それぞれ「preg_split」分解します。一文字づつ「mb_encode_numericentity」で文字参照します。文字参照する前の文字、文字参照した文字、それぞれを変数に配列として入れます。「strtr」でそれぞれを置換の指定として扱います。これで自由に指定した文字を変換することができました。

配列の数だけ繰り返すforeach を使いました。これで入力した文字数に連動して、自動で配列を入れる変数を作成できました。
foreach
http://php.net/manual/ja/control-structures.foreach.php

おまけ文字数制限

フォームエリアに文字数の制限でも付けておこうと思いつけました。下記サイト参考しました。ありがたや。ありがたや。
[JavaScript]textareaの文字数制限
http://d.hatena.ne.jp/oinusama/20090421/p2

コード公開

phpファイルを2つに分けています。片方は初めのフォーム、もう片方は計算部分です。参考にどうぞ。初心者のコードなので、微妙だと思います。

index.php


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>コード変換</title>
</head>
<body>

<script language="javascript">
function limitMaxLength(target, len, err)
{
 if( target.value.length > len )
 {
  target.value = target.value.substr(0, len);
  if( "undefined" != typeof(err) )
  {
   alert(err);
  }
 }
}
</script>

<!-- formn area-->
<form action="cal2.php" method="POST" >
<textarea name="text" rows="10" cols="100"  onchange="limitMaxLength(this, 30000)"></textarea>
<br>
<textarea name="c1" rows="10" cols="100"  onchange="limitMaxLength(this, 30000)"></textarea>
<br>
<input type="submit" class="button" value="変換">
<br>
</form>
<textarea name="text_dm" rows="10" cols="100"></textarea>
<br>
</body>
</html>


cal2.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>コード変換</title>
</head>
<body>

<script language="javascript">
function limitMaxLength(target, len, err)
{
 if( target.value.length > len )
 {
  target.value = target.value.substr(0, len);
  if( "undefined" != typeof(err) )
  {
   alert(err);
  }
 }
}
</script>

<?php
$c1 = $_POST['c1'];
$text = $_POST['text'];
function mb_str_split( $c1 ) {
    return preg_split('/(?<!^)(?!$)/u', $c1 );
}
$c1 = mb_str_split( $c1 );
//print_r($c1);
?>

<?php
$count =0;
$str = $c1;
$convmap = array(0, 0x10FFFF, 0, 0x10FFFF);
foreach ($str as $array_num){
$c1c[$count] =  mb_encode_numericentity("$str[$count]", $convmap, 'UTF-8');
$c1c[$count] = htmlspecialchars($c1c[$count]);
$count++ ;
}
?>


<?php
$string= $text;
$replace = array();
$count =0;
foreach ($c1 as $c_num){
$cc = $c1[$count];
$replace[$cc] =$c1c[$count];
$count++ ;
}
//print_r($replace);
$text_encord = strtr($string, $replace);
//$text_encord= htmlspecialchars($text);
?>


<!-- formn area-->
<form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="POST" >
<textarea name="text" rows="10" cols="100"  onchange="limitMaxLength(this, 30000)"><?php echo htmlspecialchars($_POST['text']); ?></textarea>
<br>
<textarea name="c1" rows="10" cols="100" onchange="limitMaxLength(this, 30000)"><?php echo htmlspecialchars($_POST['c1']); ?></textarea>
<br>
<input type="submit" class="button" value="変換">
<br>
<textarea name="text2" rows="10" cols="100"><?php echo $text_encord; ?></textarea>
</form>
<br>
</body>
</html>

制作したmoji encode
http://furimuke.sub.jp/changemoji/





いいね!と思ったらお願いします。


名前

AddToAny adsence adwords Amazon AmazonFBA Calculator Analytics Blogger BMAG chrome CODEPREP Eclipse envato facebook FAQ feedly Font Awesome Geek Press Gifzo Illustrator kindle LinkWithin Logaster myfonts NAVER Photoshop PHP picasa Premiere Similarweb TOPSY tumblr Wordpress wpX XAMPP zenback ウェブマスターツール ウハウハモウケタイ カスタマイズ ゲストシリーズ ココナラ サイト制作 ドメイン はじめに プレスリリース プレスリリース作成 プレスリリース利点 まとめ ランディングページ リリース送付先の見つけ方 レビュー 考察 子孫セレクタ 思いつきサイト制作 書評 足成 台湾 通販 日記 忍者おまとめボタン 文章の基本
false
ltr
item
ふりむけばコウホウ : moji encode開発メモ【コードも公開】
moji encode開発メモ【コードも公開】
http://3.bp.blogspot.com/-WAlQuO5dHoU/Uq1FVvYhgOI/AAAAAAAAOAs/Y3XIOMK75SI/s640/a0002_011707_m.jpg
http://3.bp.blogspot.com/-WAlQuO5dHoU/Uq1FVvYhgOI/AAAAAAAAOAs/Y3XIOMK75SI/s72-c/a0002_011707_m.jpg
ふりむけばコウホウ
http://www.furimuke.com/2013/12/moji-encode.html
http://www.furimuke.com/
http://www.furimuke.com/
http://www.furimuke.com/2013/12/moji-encode.html
true
8618648785166852656
UTF-8
Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All 関連記事:もっと見るはクリック→ LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS CONTENT IS PREMIUM Please share to unlock Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy