用 GD 库显示音标的尝试

  想在图片里显示音标,很自然的想到用金山词霸里面的“Kingsoft phonetic”字体,但是后来才发现这个看似 easy 的问题不是那么简单,在这里分享一下如何用 PHP 的 GD 库在图片上显示音标。

如下程序理论上可以显示出 apple 这个单词的音标来(音标部分文字复制自金山词霸):

  1.  $img = imagecreatetruecolor( 240, 320 );
  2.  $white = imagecolorallocate( $img, 255, 255, 255 );
  3.  imagettftext( $img, 8, 0, 10, 10, $white, "Ksphonet.ttf", "5Apl" );
  4.  imagepng( $img );
  5.  ?>

但是运行以后显示出来的都是方块,如果用 HTML 来调用这个字库就没问题:

  1. <span style="font-family:Kingsoft Phonetic">5Apl</span>

上面那段 PHP 代码是在 PHP 里使用 TrueType 字体的常规套路,之前曾经屡试不爽,所以只能理解为金山的这个音标字体文件比较特殊了。Google 了一把找到了解决方案:国际音标的对应字体选用及四种输入方法。使用微软自带的“Lucida Sans Unicode”字体就能搞定。

问题是我用的音标文本都是从金山词霸里复制出来的,如果直接用 Lucida Sans Unicode 字体来显示这些内容的话会原样输出,所以我做了一个金山词霸音标文本到 Lucida Sans Unicode 音标文本的转换函数:

  1.  function KP2LSU( $code )
  2.  {
  3.      $newCode = '';
  4.      $len = strlen( $code );
  5.      for( $i = 0; $i < $len; ++$i )
  6.      {
  7.          switch( $code[$i] )
  8.          {
  9.              case '5':
  10.                  $newCode .= '\'';
  11.                  break;
  12.              case '7':
  13.                  $newCode .= ',';
  14.                  break;
  15.              case 'A':
  16.                  $newCode .= '&#230;';
  17.                  break;
  18.              case 'B':
  19.                  $newCode .= '&#593;';
  20.                  break;
  21.              case 'C':
  22.                  $newCode .= '&#596;';
  23.                  break;
  24.              case 'E':
  25.                  $newCode .= '&#477;';
  26.                  break;
  27.              case 'F':
  28.                  $newCode .= '&#643;';
  29.                  break;
  30.              case 'N':
  31.                  $newCode .= '&#331;';
  32.                  break;
  33.              case 'Q':
  34.                  $newCode .= '&#652;';
  35.                  break;
  36.              case 'V':
  37.                  $newCode .= '&#658;';
  38.                  break;
  39.              case 'W':
  40.                  $newCode .= '&#415;';
  41.                  break;
  42.              case 'Z':
  43.                  $newCode .= '&#603;';
  44.                  break;
  45.              case'^':
  46.                  $newCode .= 'g';
  47.                  break;
  48.              default:
  49.                  $newCode .= $code[$i];
  50.                  break;
  51.          }
  52.      }
  53.  
  54.      return( $newCode );
  55.  }
  56.  ?>

这样一来上面那段显示 apple 音标的程序就可以这样写啦:

  1.  $img = imagecreatetruecolor( 240, 320 );
  2.  $white = imagecolorallocate( $img, 255, 255, 255 );
  3.  imagettftext( $img, 8, 0, 10, 10, $white, "Lucida_Sans_Unicode.ttf", KS2LSU( "5Apl" ) );
  4.  imagepng( $img );
  5.  ?>

2 Responses to “用 GD 库显示音标的尝试”

  1. blackgun Says:

    显示音标,为什么不直接显示音标文字,而要用图片呢?

  2. 2ndboy Says:

    呵呵,因为图片是放在手机里做单词卡片用的:)

Leave a Reply