2017-09-26 15 views
3

データを破壊せずに特殊文字を含む文字列を切り捨てます。私は使用できる文字の数に基づいて、それをやって途中でそれをカットしていますがGolangは、私がgolangに特殊文字を含む文字列を切り捨てる関数を記述しようとしています

"H㐀〾▓朗퐭텟şüöžåйкл¤"

の下に一つの例です。この結果、データが破損します。

結果は

H㐀〾▓朗퐭텟şüöžå�...

が存在しないはずのように出てきます。これらの特殊文字を検出し、これらの文字の長さに基づいて分割するにはどうすればよいですか?

package main 

import (
    "fmt" 
    "regexp" 
) 

var reNameBlacklist = regexp.MustCompile(`(&|>|<|\/|:|\n|\r)*`) 
var maxFileNameLength = 30 

// SanitizeName sanitizes user names in an email 
func SanitizeName(name string, limit int) string { 

    result := name 
    reNameBlacklist.ReplaceAllString(result, "") 
    if len(result) > limit { 
     result = result[:limit] + "..." 
    } 
    return result 
} 



func main() { 
    str := "H㐀〾▓朗퐭텟şüöžåйкл¤" 
    fmt.Println(str) 

    strsan := SanitizeName(str, maxFileNameLength) 
    fmt.Println(strsan) 

} 

答えて

6

スライシング文字列は、それらを基本となるバイト配列として扱います。スライス演算子は、ルーンではなくバイトのインデックスで動作します(各バイトは複数バイトになります)。しかし、文字列上のrangeはルーン上で反復処理されますが、返されるインデックスはバイトです。これは、あなたが(full playground example here)探しているものを行うには、それはかなり簡単になり:これは、さらに詳細に説明されている

func SanitizeName(name string, limit int) string { 
    reNameBlacklist.ReplaceAllString(name, "") 
    result := name 
    chars := 0 
    for i := range name { 
     if chars >= limit { 
      result = name[:i] 
      break 
     } 
     chars++ 
    } 
    return result 
} 

on the Go blog

+0

違いが1つである「...」ときの限界私は_shortened_文字列からブラックリストに文字を除去するように誘惑されたインチキックが、その後、あなたのいずれか(「意味( 'santitizeを変更する>>> abc "、3)'は '' abc ... ''の代わりに' '...' 'になり、コードを複雑にする必要があります。 – twotwotwo

+0

我々の現在のロジックは、私が切り捨てその後 – Sakib

2

一部の文字が複数を使用しているため、データが破損して取得された理由は、あなたはそれらを分割しています。これを回避するには、UTF-8文字を表すrune型があります。あなたはちょうどこのよう[]runeに文字列をキャストすることができます。

func SanitizeName(name string, limit int) string{ 
    reNameBlacklist.ReplaceAllString(name, "") 
    result := []rune(name) 
    // Remove the special chars here 
    return string(result[:limit]) 
} 

をこれだけ最初制限 UTF-8文字を残す必要があります。質問のコードから

+1

エイドリアンのアプローチは、Unicodeコードポイントごとに4つのバイトを割り当てる回避し、入力文字列が長い場合には以下の作業を行いますので、私はそれでいいと思う。保持する理由である文字列の最初のストリップ – twotwotwo

+1

これははるかに簡単な方法ですが、いくつかの欠点があります。しかし、短い文字列の場合、欠点は最悪の場合は小さな問題です。 –

関連する問題