dongzhabo2796 2014-06-12 15:08
浏览 28
已采纳

使用UBUNTU 12.04和Oracle的GO上的错误字符

I've got set up a machine with Ubuntu 12.04 LTS(64bits), Go 1.2.2 and go-oci8(github.com/mattn/go-oci8), but when I executed a query on Database Oracle 11G, it returned wrong characters on Russian and chinese.

I've tried to set up the NLS_LANG field on my proyect as is show it below:

os.Setenv("NLS_LANG", "SIMPLIFIED CHINESE_CHINA.AL32UTF8")
os.Setenv("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8")
os.Setenv("NLS_LANG", "RUSSIAN_CIS.AL32UTF8")

Someone can help me, what configuration of NLS_LANG I should put to get the right characters on Russian, Chinese or other difference languages than English and Spanish?

This is the example:

1.

Create table room 
{
  name_spainish varchar2(100),
  name_chinesses varchar2(100),
  name_russian varchar2(100)
}

2.

insert into room (name_spainish, name_chinesses, name_russian) values ('Habitación doble','雙人房','двухместный номер')

3.

package main

import (
  "database/sql"
  "fmt"
  "os"
  _ "github.com/mattn/go-oci8"
)

func main() {
   ExecQuery("select name_spainish, name_chinesses, name_russian from room")
 }

func ExecQuery(query string){
os.Setenv("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8")

db, err := sql.Open("oci8", "user/userps@host:1521/SID")
if err != nil {
   fmt.Println(err)
   return
}
rows, err := db.Query(query)
if err != nil {
   fmt.Println(err)
   return
}

for rows.Next() {
    var nameSpainish string
    var nameChinesses string
    var nameRussian string
    rows.Scan(&nameSpainish, &nameChinesses, &nameRussian)
    fmt.Printf("Name Spainish %s - Name Chinesses %s - Name Russian %s", nameSpainish, nameChinesses, nameRussian)
}
rows.Close()
db.Close()
}

current output: Habitación doble ???? ?????????

expect output: Habitación doble 雙人房 двухместный номер

  • 写回答

1条回答 默认 最新

  • dqgg25493 2014-06-12 23:04
    关注

    This problem had been solved converting the values into hexadecimal using the follow query

    select RAWTOHEX(UTL_RAW.cast_to_raw(name_spainish, name_chinesses, name_russian)) from room 
    

    On code was adding the package encoding/hex and the function hex.DecodeString(texto).

    for rows.Next() {
        var nameSpainish string
        var nameChinesses string
        var nameRussian string
        rows.Scan(&nameSpainish, &nameChinesses, &nameRussian)
        dataSpainish, _ := hex.DecodeString(nameSpainish)
        dataChinesses, _ := hex.DecodeString(nameChinesses)
        dataRussian, _ := hex.DecodeString(nameRussian)
        fmt.Printf("Name Spainish %s - Name Chinesses %s - Name Russian %s", string(dataSpainish), string(dataChinesses), string(dataRussian))
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分