Question

I got problems while reading arabic characters from oracle in java using JDBC driver, the main problem was i couldn't find the proper character encoding to get the correct data , but i solved the problem manually using this method:

public static String cleanORCLString(String s) throws UnsupportedEncodingException {

    byte[] bytes = s.getBytes("UTF16");
    String x = new String(bytes, "Cp1256");

    String finalS = x.substring(3);
    StringBuilder sb = new StringBuilder(finalS);

    for(int k = sb.length() - 1 ; k > 0 ; k--) {

        if(!isEven(k)) {

            sb.deleteCharAt(k);

        }

    }

    return sb.toString();
}

this method give me the correct characters like its shown in database, but when I try to update/insert arabic data, it save wrong characters. For example: my text saved in database as "?????????" instead of "مرحبا".

This is the way I connect to oracle database.

URL = ORCLConnProperties.ORCL_THIN_PREFIX + orclProp.getIpAddress()
            + orclProp.getPortNumber() + ORCLConnProperties.ORCL_THIN_SUFIX;

// URL = jdbc:oracle:thin:@10.0.0.12:1521:ORCL


    System.out.println("URL: " + URL);

    Properties connectionProps = new Properties();
    connectionProps.put("characterEncoding", "Cp1256");
    connectionProps.put("useUnicode", "true");
    connectionProps.put("user", orclProp.getUserName());
    connectionProps.put("password", orclProp.getPassword());

    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");

    } catch (ClassNotFoundException ex) {
        System.out.println("Error: unable to load driver class!");
        System.exit(1);
    }


    myDriver = new oracle.jdbc.driver.OracleDriver();

    DriverManager.registerDriver(myDriver);

    conn = DriverManager.getConnection(URL, connectionProps);

please help me in solving this issue ? Thanks.

New Note:

Database itself don't use UTF16 character set, but

"the JDBC OCI driver transfers the data from the server to the client in the character set of the database. Depending on the value of the NLS_LANG environment variable, the driver handles character set conversions: OCI converts the data from the database character set to UTF-8. The JDBC OCI driver then passes the UTF-8 data to the JDBC Class Library, where the UTF-8 data is converted to UTF-16."

this note is mentioned here: http://docs.oracle.com/cd/B10501_01/java.920/a96654/advanc.htm

Was it helpful?

Solution

First you may check the NLS_CHARACTERSET parameter of your database using the SQL*PLUS command :-

select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';

the result should be

PARAMETER

VALUE

NLS_CHARACTERSET

AR8MSWIN1256

if it's not, you have to change the value of this parameter using :-

  • hit WINDOWS KEY + r on your keyboard

  • write :- SQLPLUS sys as sysdba

  • press Enter then enter the password or just hit another Enter

  • issue the following commands :

  • SHUTDOWN IMMEDIATE

  • STARTUP RESTRICT

  • ALTER DATABASE CHARACTER SET INTERNAL_USE AR8MSWIN1256;

  • ALTER DATABASE CHARACTER SET AR8MSWIN1256;

  • SHUTDOWN IMMEDIATE

  • STARTUP

  • change the value of the NLS_LANG registry string into AMERICAN_AMERICA.AR8MSWIN1256

    if your operating system is a flavor of UNIX use

AR8ISO8859P6 instead of AR8MSWIN1256 as the value of NLS_CHARACTERSET

  • DON'T use National datatypes (i.e NVARCHAR, NTEXT, or NCLOB ) in your database unless you are going to use other languages than (Arabic and English) inside your database

  • AR8MSWIN1256 character set is sufficient for mixing arabic and english inside the same field (as far as I know).

TAKEN FROM

OTHER TIPS

Check your oracle version. if it old it can't support UTF16.

here is an article -- hope it will be useful.

http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch6unicode.htm

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top