2012-11-21 3 views
3

Я использую push-объекты primefaces для записи сообщения в p: notificationBar. если я нажимаю сообщение со специальными символами (например, russians char), у меня есть?? в моем сообщении. Как я могу исправить эту проблему? Спасибо за вашу помощь.Кодирование штрих-кода для прайминга

(config: perfferences 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); 

ответ

1

Это решение, которое не зависит от структуры атмосферы (используется Primefaces) механизмы кодирования, вероятно, отвечает за твоя проблема.

Идея состоит в том, чтобы выталкивать сообщение как кодировку Base64 и декодировать ее на стороне пользователя с помощью java-скрипта.

1.Encode ваша строка сообщения с помощью 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); 
} 

Base64 кодер вы можете найти в org.apache.commons.codec библиотеке и импортировать его в код Java с помощью

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

2.При сообщение поступает на стороне клиента расшифровывает его с помощью следующей Java Script

<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 не является независимым от браузера решением. Для получения более подробной информации об этом вы можете посетить here.

Смежные вопросы