mbstringmodule.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,249 行 · 第 1/3 页

JAVA
1,249
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Nam Nguyen */package com.caucho.quercus.lib.i18n;import com.caucho.quercus.QuercusModuleException;import com.caucho.quercus.UnimplementedException;import com.caucho.quercus.annotation.Optional;import com.caucho.quercus.annotation.Reference;import com.caucho.quercus.annotation.VariableArguments;import com.caucho.quercus.env.*;import com.caucho.quercus.lib.MailModule;import com.caucho.quercus.lib.regexp.RegexpModule;import com.caucho.quercus.lib.string.StringModule;import com.caucho.quercus.module.AbstractQuercusModule;import com.caucho.quercus.module.IniDefinitions;import com.caucho.quercus.module.IniDefinition;import com.caucho.util.L10N;import com.caucho.vfs.Encoding;import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;import java.util.Map;import java.util.logging.Logger;public class MbstringModule  extends AbstractQuercusModule{  private static final IniDefinitions _iniDefinitions = new IniDefinitions();  private static final Logger log =                       Logger.getLogger(MbstringModule.class.getName());  private static final L10N L = new L10N(MbstringModule.class);  public static final int MB_CASE_UPPER = 0;  public static final int MB_CASE_LOWER = 1;  public static final int MB_CASE_TITLE = 2;  /**   * Returns the extensions implemented by the module.   */  public String []getLoadedExtensions()  {    return new String[] { "mbstring" };  }  /**   * Returns the default php.ini values.   */  public IniDefinitions getIniDefinitions()  {    return _iniDefinitions;  }  /**   * Upper-cases, lower-cases, or capitalizes first letter of words.   */  public static StringValue mb_convert_case(Env env,                              StringValue str,                              int mode,                              @Optional("") String encoding)  {    if (mode == MB_CASE_TITLE) {      encoding = getEncoding(env, encoding);      StringValue unicodeStr = str.convertToUnicode(env, encoding);      unicodeStr = toUpperCaseTitle(env, unicodeStr);      return str.create(env, unicodeStr, encoding);    }    else if (mode == MB_CASE_LOWER)      return mb_strtolower(env, str, encoding);    else if (mode == MB_CASE_UPPER)      return mb_strtoupper(env, str, encoding);    else      return str;  }  /**   * Converts string of one encoding to another.   */  public static StringValue mb_convert_encoding(Env env,                              StringValue str,                              String destEncoding,                              @Optional() String fromEncodings)  {    // XXX: fallback encoding    int tail = fromEncodings.indexOf(',', 1);    String srcEncoding;    if (tail < 0)      srcEncoding = fromEncodings;    else      srcEncoding = getEncoding(env, fromEncodings.substring(0, tail).trim());    return decodeEncode(env, str, srcEncoding, destEncoding);  }  /**   * Performs Japanese specific charset conversion.   */  public static StringValue mb_convert_kana(Env env,                              StringValue str,                              @Optional("") String option,                              @Optional("") String encoding)  {    throw new UnimplementedException("mb_convert_kana");  }  /**   * Decodes and then encodes variables.   *   * XXX: variable arguments to convert.   */  @VariableArguments  public static StringValue mb_convert_variables(Env env,                              String toEncoding,                              String fromEncodings,                              @Reference Value vars)  {    // XXX: fallback encoding    int tail = fromEncodings.indexOf(',', 1);    if (tail < 0)      tail = fromEncodings.length();    String srcEncoding;    if (tail < 0)      srcEncoding = fromEncodings;    else      srcEncoding = getEncoding(env, fromEncodings.substring(0, tail).trim());    Value decoded = decodeAll(env, vars, srcEncoding);    vars.set(encodeAll(env, decoded, toEncoding));    return env.createString(srcEncoding);  }  /**   * Decodes mime field.   */  public static Value mb_decode_mimeheader(Env env,                              StringValue str)  {    String encoding = getEncoding(env);    try {      return QuercusMimeUtility.decodeMime(env, str, encoding);    } catch (UnsupportedEncodingException e) {      throw new QuercusModuleException(e.getMessage());    }  }  /**   * Decodes HTML numeric entity.   */  public static StringValue mb_decode_numericentity(Env env,                              StringValue str,                              ArrayValue convmap,                              @Optional String encoding)  {    throw new UnimplementedException("mb_decode_numericentity");  }  /**   * Detects encoding of string.   */  public static StringValue mb_detect_encoding(Env env,                              StringValue str,                              @Optional Value encoding_list,                              @Optional boolean strict)  {    throw new UnimplementedException("mb_detect_encoding");  }  /**   * Specifies order of charsets to test when detecting encoding.   */  public static Value mb_detect_order(Env env,                              Value encoding_list)  {    throw new UnimplementedException("mb_detect_order");  }  /**   * Encodes a string into mime.   */  public static StringValue mb_encode_mimeheader(Env env,                              StringValue str,                              @Optional("") String charset,                              @Optional("B") String transfer_encoding,                              @Optional("") String linefeed)  {    charset = getEncoding(env, charset);    try {      String mime = QuercusMimeUtility.encodeMimeWord(str.toString(),                                                      charset,                                                      transfer_encoding,                                                      linefeed,                                                      76);      return env.createString(mime);    } catch (UnsupportedEncodingException e) {      throw new QuercusModuleException(e.getMessage());    }  }  /**   * Encodes HTML numeric string entity.   */  public static StringValue mb_encode_numericentity(Env env,                              StringValue str,                              ArrayValue convmap,                              @Optional String encoding)  {    throw new UnimplementedException();  }  /**   * Returns true if pattern matches a part of string.   */  public static BooleanValue mb_ereg_match(Env env,                              StringValue pattern,                              StringValue string,                              @Optional String option)  {    String encoding = getEncoding(env);    pattern = pattern.convertToUnicode(env, encoding);    string = string.convertToUnicode(env, encoding);    // XXX: option    Value val = RegexpModule.ereg(env, pattern, string, null);    if (val == BooleanValue.FALSE)      return BooleanValue.FALSE;    else      return BooleanValue.TRUE;  }  /**   * Multibyte version of ereg_replace.   */  public static Value mb_ereg_replace(Env env,                              StringValue pattern,                              StringValue replacement,                              StringValue subject,                              @Optional String option)  {    String encoding = getEncoding(env);    pattern = pattern.convertToUnicode(env, encoding);    replacement = replacement.convertToUnicode(env, encoding);    subject = subject.convertToUnicode(env, encoding);    //XXX: option    Value val = RegexpModule.ereg_replace(env, pattern, replacement, subject);    return encodeAll(env, val, encoding);  }  /**   * Multibyte version of ereg.   */  public static Value mb_ereg(Env env,                              StringValue pattern,                              StringValue string,                              @Optional ArrayValue regs)  {    return eregImpl(env, pattern, string, regs, true);  }  /**   * Multibyte version of eregi_replace.   */  public static Value mb_eregi_replace(Env env,                              StringValue pattern,                              StringValue replacement,                              StringValue subject,                              @Optional String option)  {    String encoding = getEncoding(env);    pattern = pattern.convertToUnicode(env, encoding);    replacement = replacement.convertToUnicode(env, encoding);    subject = subject.convertToUnicode(env, encoding);    //XXX: option    Value val = RegexpModule.eregi_replace(env, pattern, replacement, subject);    return encodeAll(env, val, encoding);  }  /**   * Multibyte version of eregi.   */  public static Value mb_eregi(Env env,                              StringValue pattern,                              StringValue string,                              @Optional ArrayValue regs)  {    return eregImpl(env, pattern, string, regs, false);  }  private static Value eregImpl(Env env,                              StringValue pattern,                              StringValue string,                              ArrayValue regs,                              boolean isCaseSensitive)  {    String encoding = getEncoding(env);    pattern = pattern.convertToUnicode(env, encoding);    string = string.convertToUnicode(env, encoding);    if (regs == null) {      if (isCaseSensitive)        return RegexpModule.ereg(env, pattern, string, null);      else        return RegexpModule.eregi(env, pattern, string, null);    }    Value val;    Var regVar = new Var();    if (isCaseSensitive)      val = RegexpModule.ereg(env, pattern, string, regVar);    else      val = RegexpModule.eregi(env, pattern, string, regVar);    if (regVar.isset()) {      regs.clear();      ArrayValue results = regVar.toArrayValue(env);      for (Map.Entry<Value,Value> entry : results.entrySet()) {        Value bytes = encodeAll(env, entry.getValue(), encoding);        regs.put(entry.getKey(), bytes);      }      val = LongValue.create(              regs.get(LongValue.ZERO).toStringValue().length());    }    return val;  }  /**   * Gets current position of ereg state object.   */  public static LongValue mb_ereg_search_getpos(Env env)  {    EregSearch ereg = getEreg(env);    if (ereg == null)      return LongValue.ZERO;    return LongValue.create(ereg._position);  }  /**   * Gets the last match of ereg state object from previous matching.   */  public static Value mb_ereg_search_getregs(Env env)  {    EregSearch ereg = getEreg(env);    if (ereg == null || ereg._lastMatch == null)      return BooleanValue.FALSE;    return ereg._lastMatch;  }  /**   * Initializes a ereg state object.   */  public static BooleanValue mb_ereg_search_init(Env env,                              StringValue string,                              @Optional Value pattern,                              @Optional Value option)  {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?