tipos sirve que para ejemplos codigo codificaciones codificacion caracteres unicode windows-xp windows-vista utf-16 findstr

unicode - sirve - findstr o grep que detecta automáticamente la codificación de caracteres(UTF-16)



utf-8 encoding (7)

Quiero hacer esto:

findstr /s /c:some-symbol *

o el equivalente grep

grep -R some-symbol *

pero necesito la utilidad para autodetectar los archivos codificados en UTF-16 (y amigos) y buscarlos apropiadamente. Mis archivos incluso tienen la marca de orden de bytes FFEE en ellos, así que ni siquiera estoy buscando autodetección heroica.

¿Alguna sugerencia?

Me refiero a Windows Vista y XP.


De acuerdo con este artículo de blog de Damon Cortesi grep no funciona con archivos UTF-16, como descubriste. Sin embargo, presenta esta solución alternativa:

for f in `find . -type f | xargs -I {} file {} | grep UTF-16 | cut -f1 -d/:` do iconv -f UTF-16 -t UTF-8 $f | grep -iH --label=$f ${GREP_FOR} done

Esto es obviamente para Unix, no estoy seguro de cuál sería el equivalente en Windows. El autor de ese artículo también proporciona un script de shell para hacer lo anterior que puedes encontrar en github aquí .

Esto greps solo los archivos que son UTF-16. También grep sus archivos ASCII de la manera normal.


No dijiste en qué plataforma quieres hacer esto.

En Windows, puede usar PowerGREP , que detecta automáticamente los archivos Unicode que comienzan con una marca de orden de bytes. (También hay una opción para detectar automáticamente archivos sin una lista de materiales. La autodetección es muy confiable para UTF-8, pero limitada para UTF-16).


En Windows, también puedes usar find.exe.

find /i /n "YourSearchString" *.*

El único problema es que imprime nombres de archivo seguidos de coincidencias. Puede filtrarlos por tuberías a findstr

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"


Una solución alternativa es convertir su UTF-16 a ASCII o ANSI

TYPE UTF-16.txt > ASCII.txt

Entonces puedes usar FINDSTR.

FINDSTR object ASCII.txt


findstr /s /c:some-symbol *

puede ser reemplazado con el siguiente comando consciente de codificación de caracteres:

for /r %f in (*) do @find /i /n "some-symbol" "%f"


Gracias por las sugerencias. Me refería a Windows Vista y XP.

También descubrí esta solución, usando Sysinternals strings.exe gratis:

C:/> strings -s -b dir_tree_to_search | grep regexp

Strings.exe extrae todas las cadenas que encuentra (de los binarios, pero también funciona bien con los archivos de texto) y antepone cada resultado con un nombre de archivo y dos puntos, así que tenlo en cuenta en la expresión regular (o use cut u otro paso en la tubería ) El -s hace hacer una extracción recursiva y -b simplemente suprime el mensaje de banner.

En última instancia, aún estoy sorprendido de que las utilidades de búsqueda más importantes, Gnu grep y findstr , no manejen las codificaciones de caracteres Unicode de forma nativa.


En versiones superiores de Windows, UTF-16 es compatible con la versión de fábrica. Si no, intente cambiar la página de códigos activa por el comando chcp .

En mi caso, al usar findstr solo estaba fallando para los archivos UTF-16, sin embargo funcionó con type :

type *.* | findstr /s /c:some-symbol