blog

公開開発のためのテキストメッセージのヒント:長さの制限、改行、絵文字

インターフェースのドキュメントでは、メッセージの長さを2048に制限しています:\n\n\nテキストが占めるバイト数を正しく計算する方法\nテキストによって占有されるバイト数を計算し、我々は**** ...

May 22, 2022 · 10 min. read
シェア

インターフェースのドキュメントでは、メッセージの長さを2048に制限しています:

テキストが占めるバイト数を正しく計算する方法

テキストのバイト数を計算し、我々は****文字列クラスのgetBytes()メソッドでなければならないと思う、メソッドは、バイト配列に対応する文字列を返し、配列の長さを計算すると、文字列のバイト数を得ることができるようになります。たとえば、次のようになります:

public static void main(String []args)  { 
    // 結果:4 
    System.out.println(" .getBytes().length); 
} 

1) 上記の例を、デフォルトのエンコーディングがISO8859-1のオペレーティング・システム・プラットフォームで実行した場合、計算結果は2になります;

2) 上記の例が、デフォルトのエンコーディングがgb2312またはgbkであるオペレーティング・システム・プラットフォーム上で実行された場合、計算結果は4になります;

3) 上記の例が、デフォルトのエンコーディングがutf-8であるオペレーティング・システム・プラットフォーム上で実行された場合、計算結果は6となります;

もしこれが本当なら、String.getBytes()メソッドはシステム・プラットフォームのデフォルトでgb2312またはgbkエンコーディングを使用するということでしょうか?別の例を見てみましょう:

public static void main(String []args) throws UnsupportedEncodingException  { 
    // 結果:2 
    System.out.println(" .getBytes("ISO8859-1").length); 
    // 結果:4 
    System.out.println(" .getBytes("GB2312").length); 
    // 結果:4 
    System.out.println(" .getBytes("GBK").length); 
    // 実行結果:6 
    System.out.println(" .getBytes("UTF-8").length); 
} 
// リクエストとレスポンスのエンコーディングをUTF-8に設定する。 
request.setCharacterEncoding("UTF-8"); 
response.setCharacterEncoding("UTF-8"); 

Javaのutf-8エンコーディングモードで、計算方法のカプセル化が占めるバイト数

/** 
 * utf-8エンコーディングを使って文字列のバイト数を計算する。 
 *  
 * @param content 
 * @return 
 */ 
public static int getByteSize(String content) { 
    int size = 0; 
    if (null != content) { 
        try { 
            // 漢字はutf-8でエンコードすると3バイトになる。 
            size = content.getBytes("utf-8").length; 
        } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
        } 
    } 
    return size; 
} 

#p#

テキストメッセージにおける改行の使用

改行を使用する利点と例

改行を使うメリットは、情報をよりすっきりと美しく、直感的に表現できることです。テキストメッセージに改行を適切に使用することで、読んだ後に心地よく、すっきりとした印象を与えることができます。以下は公開アカウントxiaoqrobotのメインメニューの例ですが、改行が適切に使われていて、とても直感的で爽やかに見えませんか?

テキストメッセージで改行を使用する方法を教えてください。

/** 
 * xiaoqrobotメインメニューの 
 *  
 * @return 
 */ 
public static String getMainMenu() { 
    StringBuffer buffer = new StringBuffer(); 
    buffer.append("こんにちは、little q、サービスを選択するには番号を返信してください:").append("

"); 
    buffer.append("1  Weather").append("
"); 
    buffer.append("2  公共交通機関の照会").append("
"); 
    buffer.append("3  近隣検索").append("
"); 
    buffer.append("4  ソング・オン・デマンド").append("
"); 
    buffer.append("5  クラシックゲーム").append("
"); 
    buffer.append("6  ビューティーラジオ").append("
"); 
    buffer.append("7  顔認識").append("
"); 
    buffer.append("8  チャット nag").append("

"); 
    buffer.append(" ?”このヘルプメニューを表示する"); 
    return buffer.toString(); 
} 

どうです、導入は簡単でしょう?

1) 9行目から16行目までがメニュー項目で、すべて改行で区切られています;

(2)8行目、2つの改行の使用の最後に16号は、メニュー項目は、より階層的なコンテンツの残りの部分から分離することができるように、それは少し直感的に、快適に見えるでしょう。

#p#

MSN顔文字の送受信

MSN式コード一覧

MSNの顔文字は105種類あり、それぞれの顔文字に対応するテキストコードとシンボルコードが付与されています。

MSNの顔文字を公開アカウントに送信するユーザー

実際、使用するMSN顔文字のテキストコードに精通している場合は、顔文字の選択ボックスをポップアップせずに、入力ボックスに顔文字のコードを直接入力することもできます。下図のように:

[]

上の図からわかるように、入力ボックスに「[Bare Teeth]」、「/Bare Teeth」、「/::D」と入力しても、歯をむき出しにしてMSNの顔文字を送信する目的は同じです。このとき、記事の最初に戻ってMSNの顔文字コード比較表を見れば、何が起こっているのか理解できます。

公開アカウントがMSNの顔文字をユーザーに送信

ユーザが公開アカウントにMSN顔文字を送信するのと同じように、公開アカウントは開発モードで同じ顔文字コードを使用してMSN顔文字でユーザに返信できます。コードスニペットを以下に示します:

// テキストメッセージ 
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { 
    // テキストメッセージを返信する 
    TextMessage textMessage = new TextMessage(); 
    textMessage.setToUserName(fromUserName); 
    textMessage.setFromUserName(toUserName); 
    textMessage.setCreateTime(new Date().getTime()); 
    textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); 
    textMessage.setFuncFlag(0); 
    textMessage.setContent("[ ] /难过 /::("); 
     
    // テキストメッセージオブジェクトをxml文字列に変換する 
    respMessage = MessageUtil.textMessageToXml(textMessage); 
} 

上記のコードスニペットの機能は、送信されたメッセージのタイプを判断し、テキストメッセージであれば、3つの悲しいMSN顔文字でユーザーに返信することです。このように、MSN顔文字のテキストコードとシンボルコードは、ユーザが公開アカウントに送信しても、公開アカウントがユーザに送信しても使用できます。

公開アカウントはユーザーが送信したMSNの顔文字を認識

MSNの絵文字を送信する方法をマスターしたところで、ユーザーがMSNの絵文字を送信していることを公開アカウントがどのように認識するか見てみましょう。これはどういう意味ですか?ユーザーが公開アカウントにMSNの絵文字を送信すると、バックエンドのプログラムでどのような値が受信され、この値がMSNの絵文字であることをどのようにして知ることができるのでしょうか。

実際には、限り、例えば、簡単なテストを行う:ログに受信したテキストメッセージの出力は、それを見つけることは困難ではありません:公開アカウントにMSNの式を送信するには、バックグラウンドの手順では、シンボルコードのMSNの式で受信しました。

以下は、ユーザがMSNのエモーティコンを1つだけ送信しているかどうかを判断するために、正規表現を使って実装したメソッドです。

/** 
 * MSNのエモーティコンかどうかを判定する 
 *  
 * @param content 
 * @return 
 */ 
public static boolean isQqFace(String content) { 
    boolean result = false; 
 
    // 正規表現でMSNの顔文字を判定する 
    String qqfaceRegex = "/::\)|/::~|/::B|/::\||/:8-\)|/::<|/::$|/::X|/::Z|/::'\(|/::-\||/::@|/::P|/::D|/::O|/::\(|/::\+|/:--b|/::Q|/::T|/:,@P|/:,@-D|/::d|/:,@o|/::g|/:\|-\)|/::!|/::L|/::>|/::,@|/:,@f|/::-S|/:\?|/:,@x|/:,@@|/::8|/:,@!|/:!!!|/:xx|/:bye|/:wipe|/:dig|/:handclap|/:&-\(|/:B-\)|/:<@|/:@>|/::-O|/:>-\||/:P-\(|/::'\||/:X-\)|/::\*|/:@x|/:8\*|/:pd|/:<W>|/:beer|/:basketb|/:oo|/:coffee|/:eat|/:pig|/:rose|/:fade|/:showlove|/:heart|/:break|/:cake|/:li|/:bome|/:kn|/:footb|/:ladybug|/:shit|/:moon|/:sun|/:gift|/:hug|/:strong|/:weak|/:share|/:v|/:@\)|/:jj|/:@@|/:bad|/:lvu|/:no|/:ok|/:love|/:<L>|/:jump|/:shake|/:<O>|/:circle|/:kotow|/:turn|/:skip|/:oY|/:#-0|/:hiphot|/:kiss|/:<&|/:&>"; 
    Pattern p = Pattern.compile(qqfaceRegex); 
    Matcher m = p.matcher(content); 
    if (m.matches()) { 
        result = true; 
    } 
    return result; 
} 

以下は、このような単純な機能を実装したメソッドの使用例です。ユーザーが公開アカウントに MSN のエモーティコンを送信すると、公開アカウントはユーザーに送信した MSN のエモーティコンで返信します。実装コードは以下のとおりです:

// テキストメッセージ 
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { 
    // テキストメッセージの内容 
    String content = requestMap.get("Content"); 
     
    // ユーザーがMSNのエモーティコンを1つ送信しているかどうかを判定する。 
    if(XiaoqUtil.isQqFace(content)) { 
        // テキストメッセージを返信する 
        TextMessage textMessage = new TextMessage(); 
        textMessage.setToUserName(fromUserName); 
        textMessage.setFromUserName(toUserName); 
        textMessage.setCreateTime(new Date().getTime()); 
        textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); 
        textMessage.setFuncFlag(0); 
        // ユーザーが任意のMSNエモーティコンを送信した場合、そのMSNエモーティコンを返す。 
        textMessage.setContent(content); 
         
        // テキストメッセージオブジェクトをxml文字列に変換する 
        respMessage = MessageUtil.textMessageToXml(textMessage); 
    } 
} 
Read next

Red Hat、Red Hat Enterprise Linux プラットフォームの最新バージョンを発表

Red Hat Linux は現在、10 年のライフサイクルで安定したツールとランタイムテクノロジを導入しており、今後もそうしていきます。開発者のニーズの変化に対応して、Red Hat ソフトウェアは

May 22, 2022 · 2 min read