4

我使用 primefaces push 在 ap:notificationBar 中写入消息。如果我推送带有特殊字符(如俄罗斯字符)的消息,我有'?在我的留言中。我该如何解决这个问题?谢谢你的帮助。

(配置:primefaces 3.4 和 jsf2。我所有的 html 页面都是 utf8 编码)。

这是我的视图代码:

<p:notificationBar id="bar"
                widgetVar="pushNotifBar"
                position="bottom"
                style="z-index: 3;border: 8px outset #AB1700;width: 97%;background: none repeat scroll 0 0 #CA837D;">
            <h:form prependId="false">
                <p:commandButton icon="ui-icon-close"
                            title="#{messages['gen.close']}"
                            styleClass="ui-notificationbar-close"
                            type="button"
                            onclick="pushNotifBar.hide();"/>
            </h:form>
            <h:panelGrid columns="1" style="width: 100%; text-align: center;">
                <h:outputText id="pushNotifSummary" value="#{growlBean.summary}" style="font-size:36px;text-align:center;"/>
                <h:outputText id="pushNotifDetail" value="#{growlBean.detail}" style="font-size: 20px; float: left;" />
            </h:panelGrid>
        </p:notificationBar>
        <p:socket onMessage="handleMessage" channel="/notifications"/>

        <script type="text/javascript">
            function handleMessage(data) {
            var substr = data.split(' %% ');
            $('#pushNotifSummary').html(substr[0]);
            $('#pushNotifDetail').html(substr[1]);
            pushNotifBar.show();

            }

        </script>  

和我的 Bean 代码:

public void send() { 
        PushContext pushContext = PushContextFactory.getDefault().getPushContext(); 
        String var = summary + " %% " +  detail;
        pushContext.push("/notifications", var);
4

1 回答 1

2

这是不依赖 Atmosphere 框架(Primefaces 使用)编码机制的解决方案,可能会导致您的问题。

这个想法是将消息作为 Base64 编码的字符串推送,并使用 java 脚本在用户端对其进行解码。

1.使用Base64编码您的消息字符串并推送它

public void send() { 
    PushContext pushContext = PushContextFactory.getDefault().getPushContext(); 
    String var = summary + " %% " +  detail;
    byte b[] = var.getBytes("UTF-8");
    byte b64[] = Base64.encodeBase64(b);
    String message = new String(b64);
    pushContext.push("/notifications", message);
}

您可以在 org.apache.commons.codec 库中找到 Base64 编码器,并使用

import org.apache.commons.codec.binary.Base64;

2.当消息到达客户端时,使用以下java脚本对其进行解码

<script type="text/javascript">
    function handleMessage(data) {
      var decodedmessage=b64_to_utf8(data);
      var substr = decodedmessage.split(' %% ');
      $('#pushNotifSummary').html(substr[0]);
      $('#pushNotifDetail').html(substr[1]);
      pushNotifBar.show();
    }

    function b64_to_utf8( str ) {
      return decodeURIComponent(escape(window.atob( str )));
    }
</script> 

请注意 Base64 解码功能 window.atob 不是独立于浏览器的解决方案。有关这方面的更多详细信息,您可以访问此处

于 2013-07-02T04:46:08.207 回答