如何在Windows上使用Git commit msg钩子统计非ASCII字符?

如何在Windows上使用Git commit msg钩子统计非ASCII字符?,git,githooks,tortoisegit,Git,Githooks,Tortoisegit,我通过TortoiseGit在Windows上使用Git,目前我正尝试使用它来检查提交消息行的长度 当我只使用ASCII字符编写消息时,一切都很好。但当我用俄语写消息时,字符计数器产生的结果是实际长度的两倍。当消息保存为UTF-8文件时,计数器似乎使用默认的Windows编码或类似的东西 一些亮点: .git/COMMIT_EDITMSG具有UTF-8编码; 我的钩子中的echo$行正确显示非ASCII字符; ${line}返回一个等于实际_长度*2的值; 我尝试了在一行中迭代字符的不同方法,每

我通过TortoiseGit在Windows上使用Git,目前我正尝试使用它来检查提交消息行的长度

当我只使用ASCII字符编写消息时,一切都很好。但当我用俄语写消息时,字符计数器产生的结果是实际长度的两倍。当消息保存为UTF-8文件时,计数器似乎使用默认的Windows编码或类似的东西

一些亮点:

.git/COMMIT_EDITMSG具有UTF-8编码; 我的钩子中的echo$行正确显示非ASCII字符; ${line}返回一个等于实际_长度*2的值; 我尝试了在一行中迭代字符的不同方法,每次迭代器都将每个字节作为单独的字符处理。
更新1:我希望在不添加环境依赖项的情况下实现我的目标,也就是说,不安装Python等其他解释器。

不计算字节数-计算字符数。即,在编程语言中将解码输入从字节转换为字符。UTF-8编码的俄语字符需要2个字节。Python中的示例:

$ python

>>> len('тест')
8

>>> len(u'тест')
4

>>> len('тест'.decode('utf-8'))
4
目前,echo$line | iconv——从代码UTF-8——到代码cp866——成功了

它涵盖了我的用例,消息中只需要西里尔或基本拉丁字符,但缺乏通用性。我希望有人知道一个更干净的解决方案

以下是我当前的脚本:

#!/bin/bash
#http://chris.beams.io/posts/git-commit/#seven-rules
cnt=0

while IFS='' read -r line || [[ -n "$line" ]]; do
  cnt=$((cnt+1))
  cp866_line=`echo $line | iconv --from-code UTF-8 --to-code cp866`

  if [ $? -eq 0 ]; then
    length=${#cp866_line}
  else
    length=${#line}
  fi

  if [ $cnt -eq 1 ]; then
    # Checking if subject exceeds 50 characters
    if [ $length -gt 50 ]; then
      echo "Your subject line exceeds 50 characters"
      exit 1
    fi
    i=$(($length-1))
    last_char=${line:$i:1}
    # Subject line must not end with a period
    if [[ $last_char == "." ]]; then
      echo "Your subject line ends with a period"
      exit 1
    fi
  elif [ $cnt -eq 2 ]; then
    # Subject must be followed by a blank line
    if [ $length -ne 0 ]; then
      echo "Your subject line is followed by a non-empty line"
      exit 1
    fi
  else
    # Any line in body must not exceed 72 characters
    if [ $length -gt 72 ]; then
      echo "The line \"$line\" exceeds 72 characters"
      exit 1
    fi
  fi
done < "$1"

我不想使用Python,我想从我提供的链接修改shell脚本。我认为这个问题很清楚,看起来我需要澄清它,当然,如果我知道如何在Git shell中以编码感知的方式计算字符,我不会问这个问题:我没有说使用Python——Python只是一个例子。我说的基本上是使用真正的编程语言。如果你喜欢Java,就让它成为Java吧。我怀疑bash是否适合处理unicode字符而不是字节。